Java Techies- Solution for All
Spring AOP
Spring AOP[Aspect-oriented programming] is one of the important feature of spring framework, used to modularize cross-cutting concerns in aspects. Aspects is just an interceptor to intercept some processes, for example, when a method is execute, Spring AOP can intercept in between the executing method, and add extra functionality before or after the method execution.
In Spring AOP there are 4 type of advices are as under:
- Before advice Run before the method execution
- After returning advice Run after the method returns a result
- After throwing advice Run after the method throws an exception
- Around advice Run around the method execution, combine all three advices above.
Spring AOP Before Advice Example
Student.java File
package com.jtechies.bo; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void printThrowException() { throw new IllegalArgumentException(); } }
BeforeAdvise.java File
package com.jtechies.aop; import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class BeforeAdvise implements MethodBeforeAdvice { @Override public void before(Method method, Object[] args, Object target)throws Throwable { System.out.println("BeforeAdvise is running..."); } }
Test.java File
package com.jtechies.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support .ClassPathXmlApplicationContext; import com.jtechies.bo.Student; public class Test { public static void main(String[] args) { ApplicationContext appContext = new ClassPathXmlApplicationContext( new String[] { "spring.xml" }); Student student = (Student) appContext.getBean("studentServiceProxy"); System.out.println("---------------------------"); System.out.println ("Student name = "+ student.getName()); System.out.println("---------------------------"); System.out.println ("Student age = "+student.getAge()); System.out.println("---------------------------"); try { student.printThrowException(); } catch (Exception e) { } } }
spring.xml File
<?xml version="1.0" encoding="UTF-8"?> <beans 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-3.0.xsd"> <bean id="student" class="com.jtechies.bo.Student"> <property name="name" value="peter"/> <property name="age" value="25"/> </bean> <bean id="before" class="com.jtechies.aop.BeforeAdvise"> <bean id="studentServiceProxy" class="org.springframework.aop.framework .ProxyFactoryBean"> <property name="target" ref="student"/> <property name="interceptorNames"> <list> <value>before</value> </list> </property> </bean> </beans>
Output
************************* BeforeAdvise is running... Student name = peter ************************* BeforeAdvise is running... Student age = 25 ************************* BeforeAdvise is running...
Spring AOP After returning Advice Example
AfterMethod.java File
package com.jtechies.aop; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; public class AfterMethod implements AfterReturningAdvice{ @Override public void afterReturning(Object returnValue, Method method, Object[] args,Object target) throws Throwable { System.out.println ("AfterReturningAdvice is running..."); } }
spring.xml File
<?xml version="1.0" encoding="UTF-8"?> <beans 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-3.0.xsd"> <bean id="student" class="com.jtechies.bo.Student"> <property name="name" value="peter"/> <property name="age" value="25"/> </bean> <bean id="afterReturn" class="com.jtechies.aop.AfterMethod"> <bean id="studentServiceProxy" class="org.springframework.aop.framework .ProxyFactoryBean"> <property name="target" ref="student"/> <property name="interceptorNames"> <list> <value>afterReturn</value> </list> </property> </bean> </beans>
Output
----------------------------- Student name = peter AfterReturningAdvice is running... ----------------------------- Student age = 25 AfterReturningAdvice is running... -----------------------------
Spring AOP After throwing advice Example
ThrowsMethod.java File
package com.jtechies.aop; import org.springframework.aop.ThrowsAdvice; public class ThrowsMethod implements ThrowsAdvice{ public void afterThrowing(IllegalArgumentException e) throws Throwable { System.out.println("ThrowsMethod is running...!"); } }
spring.xml File
<?xml version="1.0" encoding="UTF-8"?> <beans 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-3.0.xsd"> <bean id="student" class="com.jtechies.bo.Student"> <property name="name" value="peter"/> <property name="age" value="25"/> </bean> <bean id="throwsMethod" class="com.jtechies.aop.ThrowsMethod"> <bean id="studentServiceProxy" class="org.springframework.aop.framework .ProxyFactoryBean"> <property name="target" ref="student"/> <property name="interceptorNames"> <list> <value>throwsMethod</value> </list> </property> </bean> </beans>
Output
----------------------------- Student name = peter ----------------------------- Student age = 25 ----------------------------- ThrowsMethod is running...!
Spring AOP Around advice Example
ThrowsMethod.java File
package com.jtechies.aop; import java.util.Arrays; import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation; public class AroundAdvice 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())); // same with MethodBeforeAdvice System.out.println("Before advice is running..."); try { // proceed to original method call Object result = methodInvocation.proceed(); // same with AfterReturningAdvice System.out.println ("Returning is running..."); return result; } catch (IllegalArgumentException e) { // same with ThrowsAdvice System.out.println ("ThrowsMethod is running..."); throw e; } } }
spring.xml File
<?xml version="1.0" encoding="UTF-8"?> <beans 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-3.0.xsd"> <bean id="student" class="com.jtechies.bo.Student"> <property name="name" value="peter"/> <property name="age" value="25"/> </bean> <bean id="aroundAdvice" class="com.jtechies.aop.AroundAdvice"> <bean id="studentServiceProxy" class="org.springframework.aop.framework .ProxyFactoryBean"> <property name="target" ref="student"/> <property name="interceptorNames"> <list> <value>aroundAdvice</value> </list> </property> </bean> </beans>
Output
----------------------------- Method name : getName Method arguments : [] Before advice is running... Returning is running... Student name = peter ----------------------------- Method name : getAge Method arguments : [] Before advice is running... Returning is running... Student age = 25 ----------------------------- Method name : printThrowException Method arguments : [] Before advice is running... ThrowsMethod is running...