实例简介:
这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间。
用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用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
待续。。。
时间: 2024-10-14 00:03:58