Spring AOP — Pointcut | Code Factory
3 min readFeb 1, 2021
Donate : Link
WordPress Blog : Link
Applications… : Link
Spring Tutorial Index Page: Link
- We use Pointcut class to apply condition.
- To implement Pointcut we have 2 classes.
- StaticMethodMatcherPointcut
- NameMetchMethodPointcut - * We can add target in AOP using setTarget() method and service using setInterceptorNames() method. In case if we have Pointcut then it is not possible to add Service and Pointcut both in AOP. Then we need to add Service and Pointcut to Advisor and then add Advisor into an AOP. Advisor is combination of Pointcut and Advice.
- We have 2 Advisor
- DefaultPointcutAdvisor
- RegexpMethodPointcutAdvisor - StaticMethodMatcherPointcut Example
Create Java Project
- Open Eclipse
- Go to File -> New -> Other… -> Java Project
- Create AOP-Programmatic6 project
- Right click on project -> Build Path -> Configure Build Path -> Libraries tab -> Add External JARs
- aopalliance.jar
- aspectjrt.jar
- aspectjweaver.jar
- cglib-nodep-X.X.jar
- commons-logging-X.X.jar
- spring-aop-X.X.X.jar
- spring-beans-X.X.X.jar
- spring-context-X.X.X.jar
- spring-core-X.X.X.jar
- aspectjlib-X.X.X.jar
- spring-aspects-X.X.X.jar - * You can find dtd information from spring-beans-X.X.X.jar -> org -> springframework -> beans -> factory -> xml -> spring-beans.dtd (line no 36 & 37)
spring.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd"><beans>
<!-- target -->
<bean id="b" class="com.codeFactory.business.Bank" /> <!-- service -->
<bean id="lbs" class="com.codeFactory.service.LogBeforeService" /> <!-- pointcut -->
<bean id="dp" class="com.codeFactory.service.DepositPointcut" />
<!-- advisor -->
<bean id="dpa" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="lbs"></property>
<property name="pointcut" ref="dp"></property>
</bean>
<!-- proxy -->
<bean id="pfb" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="b" />
<property name="interceptorNames">
<list>
<value>dpa</value>
</list>
</property>
</bean>
</beans>
DepositPointcut.java
package com.codeFactory.service;import java.lang.reflect.Method;import org.springframework.aop.support.StaticMethodMatcherPointcut;/**
* @author code.factory
*
*/
public class DepositPointcut extends StaticMethodMatcherPointcut { /* When deposit method is called then service will run.
* For O/P check console */
@Override
public boolean matches(Method m, Class c) {
return m.getName().equals("deposit")? true : false;
}
}
LogBeforeService.java
package com.codeFactory.service;import java.lang.reflect.Method;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.MethodBeforeAdvice;import com.codeFactory.business.Bank;/**
* @author code.factory
*
*/
public class LogBeforeService implements MethodBeforeAdvice { @Override
public void before(Method method, Object[] objects, Object object) throws Throwable {
Log l = LogFactory.getLog(Bank.class);
l.info("Deposit method");
}
}
Bank.java
package com.codeFactory.business;/**
* @author code.factory
*
*/
public class Bank { private int amount = 1000;
private String accNo = "SBI12345";
public int deposit(int amount, String accNo) {
System.out.println("Bank.deposit()");
if(accNo.equals(this.accNo)) {
this.amount += amount;
} else {
throw new AccnoNotFoundException();
}
return this.amount;
}
public int findBalance(String accNo) {
System.out.println("Bank.findBalance()");
if(accNo.equals(this.accNo)) {
return this.amount;
} else {
throw new AccnoNotFoundException();
}
}
}
AccnoNotFoundException.java
package com.codeFactory.business;/**
* @author code.factory
*
*/
public class AccnoNotFoundException extends RuntimeException { @Override
public String toString() {
return "AccNo invalid";
}
}
Client.java
package com.codeFactory.test;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import com.codeFactory.business.Bank;/**
* @author code.factory
*
*/
public class Client {
public static void main(String... args) {
ApplicationContext context = new ClassPathXmlApplicationContext("com/codeFactory/resources/spring.xml");
Bank bankProxy = (Bank) context.getBean("pfb");
/* uncomment below code to run service */
/*int amt = bankProxy.deposit(150, "SBI12345");
System.out.println(amt);*/
System.out.println(bankProxy.findBalance("SBI12345"));
}
}
Output:
Bank.findBalance()
1000