Spring AOP — Befor, After, Around Advice | Code Factory
3 min readJan 30, 2021
Donate : Link
WordPress Blog : Link
Applications… : Link
Spring Tutorial Index Page: Link
- MethodBeforeAdvice, AfterReturningAdvice, MethodInterceptor example using XML
Create Java Project
- Open Eclipse
- Go to File -> New -> Other… -> Java Project
- Create AOP-Programmatic5 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" />
<bean id="las" class="com.codeFactory.service.LogAfterService" />
<bean id="lars" class="com.codeFactory.service.LogAroundService" /> <!-- proxy -->
<bean id="pfb" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="b" />
<property name="interceptorNames">
<list>
<value>lbs</value>
<value>las</value>
<value>lars</value>
</list>
</property>
</bean>
</beans>
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");
}
}
LogAfterService.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.AfterReturningAdvice;import com.codeFactory.business.Bank;/**
* @author code.factory
*
*/
public class LogAfterService implements AfterReturningAdvice { @Override
public void afterReturning(Object obj1, Method method, Object[] objects, Object obj2) throws Throwable {
/*
* obj1 is return value
* obj2 is object
*/
Log l = LogFactory.getLog(Bank.class);
l.info("Deposit method " + obj1);
l.info("Deposit method " + obj2);
}
}
LogAroundService.java
package com.codeFactory.service;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import com.codeFactory.business.Bank;/**
* @author code.factory
*
*/
public class LogAroundService implements MethodInterceptor { @Override
public Object invoke(MethodInvocation mi) throws Throwable {
Log l = LogFactory.getLog(Bank.class);
l.info("before deposite code");
Object obj = mi.proceed();
l.info("after deposite code");
return obj;
}
}
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;
}
}
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");
int amt = bankProxy.deposit(150, "SBI12345");
System.out.println(amt);
}
}
Output:
Dec 23, 2020 1:42:37 PM com.codeFactory.service.LogBeforeService before
INFO: Deposit method
Dec 23, 2020 1:42:37 PM com.codeFactory.service.LogAroundService invoke
INFO: before deposite code
Bank.deposit()
Dec 23, 2020 1:42:37 PM com.codeFactory.service.LogAroundService invoke
INFO: after deposite code
Dec 23, 2020 1:42:37 PM com.codeFactory.service.LogAfterService afterReturning
INFO: Deposit method 1150
Dec 23, 2020 1:42:37 PM com.codeFactory.service.LogAfterService afterReturning
INFO: Deposit method com.codeFactory.business.Bank@4667ae56
1150