In last Spring AOP advice examples, the entire methods of a class are intercepted automatically. But for most cases, you may just need a way to intercept only one or two methods, this is what ‘Pointcut’ come for. It allow you to intercept a method by it’s method name. In addition, a ‘Pointcut’ must be associated with an ‘Advisor’.
In Spring AOP, comes with three very technical terms – Advices, Pointcut , Advisor, put it in unofficial way…
  • Advice – Indicate the action to take either before or after the method execution.
  • Pointcut – Indicate which method should be intercept, by method name or regular expression pattern.
  • Advisor – Group ‘Advice’ and ‘Pointcut’ into a single unit, and pass it to a proxy factory object.
Review last Spring AOP advice examples again.
File : CustomerService.java
package com.mkyong.customer.services;
 
public class CustomerService
{
	private String name;
	private String url;
 
	public void setName(String name) {
		this.name = name;
	}
 
	public void setUrl(String url) {
		this.url = url;
	}
 
	public void printName(){
		System.out.println("Customer name : " + this.name);
	}
 
	public void printURL(){
		System.out.println("Customer website : " + this.url);
	}
 
	public void printThrowException(){
		throw new IllegalArgumentException();
	}
 
}
File : Spring-Customer.xml
 xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	 id="customerService" class="com.mkyong.customer.services.CustomerService">
		 name="name" value="Yong Mook Kim" />
		 name="url" value="http://www.mkyong.com" />
	
 
	 id="hijackAroundMethodBeanAdvice" class="com.mkyong.aop.HijackAroundMethod" />
 
	 id="customerServiceProxy" 
                class="org.springframework.aop.framework.ProxyFactoryBean">
 
		 name="target" ref="customerService" />
 
		 name="interceptorNames">
			
				hijackAroundMethodBeanAdvice
			
		
	
File : HijackAroundMethod.java
package com.mkyong.aop;
 
import java.util.Arrays;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
 
public class HijackAroundMethod implements MethodInterceptor {
	@Override
	public Object invoke(MethodInvocation methodInvocation) throws Throwable {
 
		System.out.println("Method name : "
				+ methodInvocation.getMethod().getName());
		System.out.println("Method arguments : "
				+ Arrays.toString(methodInvocation.getArguments()));
 
		System.out.println("HijackAroundMethod : Before method hijacked!");
 
		try {
			Object result = methodInvocation.proceed();
			System.out.println("HijackAroundMethod : Before after hijacked!");
 
			return result;
 
		} catch (IllegalArgumentException e) {
 
			System.out.println("HijackAroundMethod : Throw exception hijacked!");
			throw e;
		}
	}
}
Run it
package com.mkyong.common;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.mkyong.customer.services.CustomerService;
 
public class App {
	public static void main(String[] args) {
		ApplicationContext appContext = new ClassPathXmlApplicationContext(
				new String[] { "Spring-Customer.xml" });
 
		CustomerService cust = (CustomerService) appContext
				.getBean("customerServiceProxy");
 
		System.out.println("*************************");
		cust.printName();
		System.out.println("*************************");
		cust.printURL();
		System.out.println("*************************");
		try {
			cust.printThrowException();
		} catch (Exception e) {
		}
	}
}
Output
*************************
Method name : printName
Method arguments : []
HijackAroundMethod : Before method hijacked!
Customer name : Yong Mook Kim
HijackAroundMethod : Before after hijacked!
*************************
Method name : printURL
Method arguments : []
HijackAroundMethod : Before method hijacked!
Customer website : http://www.mkyong.com
HijackAroundMethod : Before after hijacked!
*************************
Method name : printThrowException
Method arguments : []
HijackAroundMethod : Before method hijacked!
HijackAroundMethod : Throw exception hijacked!
The entire methods of customer service class are intercepted. Later, we show you how to use “pointcuts” to intercept onlyprintName() method.

Pointcuts Example

You can match the method via following two ways :
  1. Name match
  2. Regular repression match

1. Pointcuts – Name Match Example

Intercept a printName() method via ‘pointcut’ and ‘advisor’. Create a NameMatchMethodPointcut pointcut bean, and put the method name you want to intercept in the ‘mappedName‘ property value.
	 id="customerPointcut"
        class="org.springframework.aop.support.NameMatchMethodPointcut">
		 name="mappedName" value="printName" />
	
Create a DefaultPointcutAdvisor advisor bean, and associate both advice and pointcut.
	 id="customerAdvisor"
		class="org.springframework.aop.support.DefaultPointcutAdvisor">
		 name="pointcut" ref="customerPointcut" />
		 name="advice" ref="hijackAroundMethodBeanAdvice" />
	
Replace the proxy’s ‘interceptorNames’ to ‘customerAdvisor’ (it was ‘hijackAroundMethodBeanAdvice’).
	 id="customerServiceProxy"
		class="org.springframework.aop.framework.ProxyFactoryBean">
 
		 name="target" ref="customerService" />
 
		 name="interceptorNames">
			
				customerAdvisor
			
		
	
Full bean configuration file
 xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
 
	 id="customerService" class="com.mkyong.customer.services.CustomerService">
		 name="name" value="Yong Mook Kim" />
		 name="url" value="http://www.mkyong.com" />
	
 
	 id="hijackAroundMethodBeanAdvice" class="com.mkyong.aop.HijackAroundMethod" />
 
	 id="customerServiceProxy" 
                class="org.springframework.aop.framework.ProxyFactoryBean">
 
		 name="target" ref="customerService" />
 
		 name="interceptorNames">
			
				customerAdvisor
			
		
	
 
	 id="customerPointcut" 
                class="org.springframework.aop.support.NameMatchMethodPointcut">
		 name="mappedName" value="printName" />
	
 
	 id="customerAdvisor" 
                 class="org.springframework.aop.support.DefaultPointcutAdvisor">
		 name="pointcut" ref="customerPointcut" />
		 name="advice" ref="hijackAroundMethodBeanAdvice" />
	
 
Run it again, output
*************************
Method name : printName
Method arguments : []
HijackAroundMethod : Before method hijacked!
Customer name : Yong Mook Kim
HijackAroundMethod : Before after hijacked!
*************************
Customer website : http://www.mkyong.com
*************************
Now, you only intercept the printName() method.
PointcutAdvisor
Spring comes with PointcutAdvisor class to save your work to declare advisor and pointcut into different beans, you can use NameMatchMethodPointcutAdvisor to combine both into a single bean.
	 id="customerAdvisor"
		class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
 
		 name="mappedName" value="printName" />
		 name="advice" ref="hijackAroundMethodBeanAdvice" />
 
	

2. Pointcut – Regular Expression Example

You can also match the method’s name by using regular expression pointcut – RegexpMethodPointcutAdvisor.
	 id="customerAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		 name="patterns">
			
				.*URL.*
			
		
 
		 name="advice" ref="hijackAroundMethodBeanAdvice" />
	
Now, it intercepts the method which has words ‘URL’ within the method name. In practice, you can use it to manage DAO layer, where you can declare “.*DAO.*” to intercept all your DAO classes to support transaction.

Download Source Code

This article is under - Spring Tutorials , Tags:  ,