Spring AOP实例——异常处理和记录程序执行时间
实例简介:
这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间。
用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动代理功能,然后一个用Java的动态代理,一个用CGLIB代理。
实现思路:
首先定义负责异常处理的Advice:ExceptionHandler.java,定义记录程序执行时间的Advice:TimeHandler.java
然后定义业务逻辑接口LogicInterface.java,编写实现业务逻辑接口的类Logic1.java,该业务逻辑在Spring AOP中使用java的动态代理
编写另一个业务逻辑Logic2.java,不实现业务逻辑接口,该业务逻辑在Spring AOP中使用CGLIB代理,然后使用自动代理定义配置文件config.xml
最后编写测试程序,执行并查看输出结果。
1.定义异常处理的Adice:ExceptionHandle.java
1 //***ExceptionHandler.java******** 2 package com.gc.action; 3 4 import java.lang.reflect.Method; 5 6 import org.apache.log4j.Level; 7 import org.apache.log4j.Logger; 8 import org.springframework.aop.ThrowsAdvice; 9 10 //使用Throw通知类型来实现Advice 11 public class ExceptionHandler implements ThrowAdvice{ 12 private Logger logger = Logger.getLogger(this.getClass().getName()); 13 14 public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)throws Throwable{ 15 logger.log(Level.INFO,args[0]+" 执行 "+method.getName()+"时有异常抛出..."+subclass); 16 17 } 18 19 }
2.定义记录程序执行时间的Advice为TimeHandler.java
1 //***TimeHandler.java***** 2 package com.gc.action; 3 4 import org.aopalliance.interceptor.MethodInterceptor; 5 import org.aopalliance.interceptor.MethodInvocation; 6 import org.apache.log4j.Level; 7 import org.apache.log4j.Logger; 8 9 public class TimeHandler implements MethodInterceptor{ 10 private Logger logger = Logger.getLogger(this.getClass().getName()); 11 12 public Object invoke(MethodInvocation methodInvocation)throws Throwable{ 13 long procTime = System.currentTimeMillis(); 14 logger.log(Level.INFO,methodInvocation.getArguments()[0]+"开始执行"+methodInvocation.getMethod()+"方法"); 15 } 16 try{ 17 Object result = methodInvocation.proceed(); 18 return result; 19 20 } 21 finally{ 22 procTime = System.currentTimeMillis()-procTime; 23 logger.log(Level.INFO,methodInvocation.getArguments()[0]+"执行"+methodInvocation.getMethod()+"方法结束"); 24 logger.log(Level.INFO,"执行"+methodInvocation.getMethod.getName()+"方法共用了"+procTime+"毫秒"); 25 } 26 }
3.定义业务逻辑接口
1 //*****LogicInterface.java***** 2 package com.gc.impl; 3 4 public interface LogicInterface{ 5 public void doInsert(String name); 6 public void doUpdate(String name); 7 public void doDelete(String name); 8 9 }
4.编写实现业务逻辑接口的类Logic1.java
1 //*****Logic2.java****** 2 package com.gc.action; 3 4 import com.gc.impl.LogicInterface; 5 6 public class Logic1 implements LogicInterface{ 7 public void doInsert(String name) 8 { 9 System.out.println("新增..."); 10 for(int i=0;i<1000000;i++) 11 { 12 //模拟执行时间 13 } 14 } 15 public void doUpdate(String name) 16 { 17 System.out.println("修改..."); 18 for(int i=0;i<3000000;i++) 19 { 20 //模拟执行时间 21 } 22 } 23 public void doDelete(String name) 24 { 25 System.out.println("删除..."); 26 for(int i=0;i<2000000;i++) 27 { 28 //模拟执行时间 29 } 30 } 31 32 }
5.编写不实现业务逻辑接口的类Logic2.java
1 1 //*****Logic2.java****** 2 2 package com.gc.action; 3 3 4 4 import com.gc.impl.LogicInterface; 5 5 6 6 public class Logic2{ 7 7 public void doInsert(String name) 8 8 { 9 9 System.out.println("新增..."); 10 10 for(int i=0;i<4000000;i++) 11 11 { 12 12 //模拟执行时间 13 13 } 14 14 } 15 15 public void doUpdate(String name) 16 16 { 17 17 System.out.println("修改..."); 18 18 for(int i=0;i<5000000;i++) 19 19 { 20 20 //模拟执行时间 21 21 } 22 22 } 23 23 public void doDelete(String name) 24 24 { 25 25 System.out.println("删除..."); 26 26 for(int i=0;i<6000000;i++) 27 27 { 28 28 //模拟执行时间 29 29 } 30 30 } 31 31 32 32 }
6.使用自动代理定义配置文件config.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 4 "http://www.springframework.org/dtd/spring-beans.dtd"> 5 6 <beans> 7 <bean id="logic1" class="com.gc.action.Logic1"/> 8 <bean id="logic2" class="com.gc.action.Logic2"/> 9 <!--设定自动代理--> 10 <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/> 11 <!--负责记录有异常发生时的信息--> 12 <bean id="exceptionHandler" class="com.gc.action.ExceptionHandler"/> 13 <bean id="exceptionHandlerAdvisor" class="org.springframework.support.RegexpMethodPointcutAdvisor"> <property name="advice"> 14 <ref bean="exceptionhandler"/> 15 </property> 16 <property name="patterns"> 17 <value>.*.*</value> 18 </property> 19 </bean> 20 <!--负责记录方法的记录时间--> 21 <bean id="timeHandler" class="com.gc.action.TimeHandler"/> 22 <bean id="timeHandlerAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> 23 <property name="advice"> 24 <ref bean="timeHandler"/> 25 </property> 26 <property name="patterns"> 27 <value>.*.*</value> 28 </property> 29 </bean> 30 </beans>
7.测试程序
1 //***TestLogic1**** 2 package com.gc.test; 3 4 import org.springframework.context.ApplicationContext; 5 import org.srpingframework.context.support.FileSystemXmlApplicationContext; 6 7 import com.gc.impl.LogicInterface; 8 9 public class TestLogic1{ 10 public static void main(String[] args)throw InstantiationExcetion,IIIegalAccessException,ClassNotFoundException{ 11 ApplicationContext actx = new FileSystemXmlApplicationContext("exception_config.xml"); 12 LogicInterface logic=(LogicInterface)actx.getBean("logic1"); 13 try{ 14 logic.doInsert("张"); 15 logic.doUpdate("王"); 16 logic.doDelete("李"); 17 } 18 catch(Exception e) 19 { 20 } 21 } 22 }