Requirement : In case a particular method call throws an exception, a log needs to be printed.
No change in IteratorImpl interface
File : Iterator.java
File : IteratorImpl.java
File : AopExampleAfterThrows.java
create the advisor and advice beans
File : aopBeans.xml
File : SpringAopMain.java
Step 1 :
Changes in IteratorImpl class to mock an exception being thrown.No change in IteratorImpl interface
File : Iterator.java
package com.simpleCodeStuffs.aop; public interface Iterator { void goPrevious(); void goNext(); }
File : IteratorImpl.java
package com.simpleCodeStuffs.aop; public class IteratorImpl implements Iterator{ String flowName; public void goNext() { System.out.println("goNext Method Called on flow - "+flowName); throw new RuntimeException(); } public void goPrevious(){ System.out.println("goPrevious Method called on flow - "+flowName); } public String getFlowName() { return flowName; } public void setFlowName(String flowName) { this.flowName = flowName; } }
Step 2 :
Create a new class AopExampleAfterThrows to implement the new functionalityFile : AopExampleAfterThrows.java
package com.simpleCodeStuffs.aop; import org.springframework.aop.ThrowsAdvice; public class AopExampleAfterThrows implements ThrowsAdvice { public void afterThrowing(RuntimeException runtimeException) { System.out.println("Logging step : Exception thrown by the method "); } }
Step 3 :
Changes in the aopBeans.xml file. Similar to the Before Advice and After returns Advice,create the advisor and advice beans
File : aopBeans.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- Bean Classes --> <bean id="beanTarget" class="com.simpleCodeStuffs.aop.IteratorImpl"> <property name="flowName" value="existing code" /> </bean> <!-- Bean configuration --> <bean id="businesslogicbean"
class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyInterfaces"> <value>com.simpleCodeStuffs.aop.Iterator</value> </property> <property name="target"> <ref local="beanTarget" /> </property> <property name="interceptorNames"> <list> <value>theAfterThrowingAdvisor</value> </list> </property> </bean> <bean id="theAfterThrowingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"> <ref local="theAfterThrowingAdvice" /> </property> <property name="pattern"> <value>.*</value> </property> </bean> <bean id="theAfterThrowingAdvice"
class="com.simpleCodeStuffs.aop.AopExampleAfterThrows" /> </beans>
Step 4 :
No major change in the Main class. Simply place a call to the method that throws a mock exception.File : SpringAopMain.java
package com.simpleCodeStuffs.aop; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class SpringAopMain { public static void main(String[] args) { // Read the configuration file ApplicationContext context = new ClassPathXmlApplicationContext("aopBeans.xml"); // Instantiate an object Iterator IteratorInterface = (Iterator) context.
getBean("businesslogicbean"); // Execute the public method of the bean IteratorInterface.goNext(); } }