实例简介:

  这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间。

用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用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

 //***ExceptionHandler.java********
package com.gc.action; import java.lang.reflect.Method; import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.springframework.aop.ThrowsAdvice; //使用Throw通知类型来实现Advice
public class ExceptionHandler implements ThrowAdvice{
private Logger logger = Logger.getLogger(this.getClass().getName()); public void afterThrowing(Method method,Object[] args,Object target,Throwable subclass)throws Throwable{
logger.log(Level.INFO,args[0]+" 执行 "+method.getName()+"时有异常抛出..."+subclass); } }

2.定义记录程序执行时间的Advice为TimeHandler.java

 //***TimeHandler.java*****
package com.gc.action; import org.aopalliance.interceptor.MethodInterceptor;
import org.aopalliance.interceptor.MethodInvocation;
import org.apache.log4j.Level;
import org.apache.log4j.Logger; public class TimeHandler implements MethodInterceptor{
private Logger logger = Logger.getLogger(this.getClass().getName()); public Object invoke(MethodInvocation methodInvocation)throws Throwable{
long procTime = System.currentTimeMillis();
logger.log(Level.INFO,methodInvocation.getArguments()[0]+"开始执行"+methodInvocation.getMethod()+"方法");
}
try{
Object result = methodInvocation.proceed();
return result; }
finally{
procTime = System.currentTimeMillis()-procTime;
logger.log(Level.INFO,methodInvocation.getArguments()[0]+"执行"+methodInvocation.getMethod()+"方法结束");
logger.log(Level.INFO,"执行"+methodInvocation.getMethod.getName()+"方法共用了"+procTime+"毫秒");
}
}

3.定义业务逻辑接口

 //*****LogicInterface.java*****
package com.gc.impl; public interface LogicInterface{
public void doInsert(String name);
public void doUpdate(String name);
public void doDelete(String name); }

4.编写实现业务逻辑接口的类Logic1.java

 //*****Logic2.java******
package com.gc.action; import com.gc.impl.LogicInterface; public class Logic1 implements LogicInterface{
public void doInsert(String name)
{
System.out.println("新增...");
for(int i=0;i<1000000;i++)
{
//模拟执行时间
}
}
public void doUpdate(String name)
{
System.out.println("修改...");
for(int i=0;i<3000000;i++)
{
//模拟执行时间
}
}
public void doDelete(String name)
{
System.out.println("删除...");
for(int i=0;i<2000000;i++)
{
//模拟执行时间
}
} }

5.编写不实现业务逻辑接口的类Logic2.java

  1 //*****Logic2.java******
2 package com.gc.action;
3
4 import com.gc.impl.LogicInterface;
5
6 public class Logic2{
7 public void doInsert(String name)
8 {
9 System.out.println("新增...");
10 for(int i=0;i<4000000;i++)
11 {
12 //模拟执行时间
13 }
14 }
15 public void doUpdate(String name)
16 {
17 System.out.println("修改...");
18 for(int i=0;i<5000000;i++)
19 {
20 //模拟执行时间
21 }
22 }
23 public void doDelete(String name)
24 {
25 System.out.println("删除...");
26 for(int i=0;i<6000000;i++)
27 {
28 //模拟执行时间
29 }
30 }
31
32 }

6.使用自动代理定义配置文件config.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 id="logic1" class="com.gc.action.Logic1"/>
<bean id="logic2" class="com.gc.action.Logic2"/>
<!--设定自动代理-->
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
<!--负责记录有异常发生时的信息-->
<bean id="exceptionHandler" class="com.gc.action.ExceptionHandler"/>
<bean id="exceptionHandlerAdvisor" class="org.springframework.support.RegexpMethodPointcutAdvisor"> <property name="advice">
<ref bean="exceptionhandler"/>
</property>
<property name="patterns">
<value>.*.*</value>
</property>
</bean>
<!--负责记录方法的记录时间-->
<bean id="timeHandler" class="com.gc.action.TimeHandler"/>
<bean id="timeHandlerAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice">
<ref bean="timeHandler"/>
</property>
<property name="patterns">
<value>.*.*</value>
</property>
</bean>
</beans>

7.测试程序

 //***TestLogic1****
package com.gc.test; import org.springframework.context.ApplicationContext;
import org.srpingframework.context.support.FileSystemXmlApplicationContext; import com.gc.impl.LogicInterface; public class TestLogic1{
public static void main(String[] args)throw InstantiationExcetion,IIIegalAccessException,ClassNotFoundException{
ApplicationContext actx = new FileSystemXmlApplicationContext("exception_config.xml");
LogicInterface logic=(LogicInterface)actx.getBean("logic1");
try{
logic.doInsert("张");
logic.doUpdate("王");
logic.doDelete("李");
}
catch(Exception e)
{
}
}
}

最新文章

  1. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)
  2. 百度地图JavaScript API覆盖物旋转时出现偏移
  3. [转]VS2015 cordova尝试-camera
  4. USACO1.5 Checker Challenge(类n皇后问题)
  5. DW,DM,ODS的区别
  6. (十) Jquery的基本使用
  7. 学习TensorFlow,保存学习到的网络结构参数并调用
  8. Python学习笔记【Supervisor】:使用Supervisor监控Tornado进程
  9. Django之auth模块
  10. 开源项目Bug悬赏任务
  11. [No000016B]清华maven库配置settings.xml
  12. 用IntelliJ的IDEA来创建SpringBoot框架
  13. 牛客练习赛14A(唯一分解定理)
  14. Inteiilj IDEA 团队代码格式规范
  15. BZOJ2957: 楼房重建(线段树&amp;LIS)
  16. Android 包信息工具类
  17. Scratch3.0——克隆代码仓库的正确姿势
  18. C#:对含有中文的字符串进行MD5加密
  19. LOJ2611. NOIP2013 积木大赛 【线段树】
  20. 算法 PK 猫咪 | 章鱼保罗后继竟然是只猫?

热门文章

  1. Gson解析纯Json数组
  2. sh 自动化安装配置FTP服务器
  3. Git 常用命令详解
  4. 6. UIImageView 的使用
  5. JS判断有无网络(移动端)
  6. centos6.6 安装jdk1.7
  7. 实现滑动可固定header以及页面刷新
  8. VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
  9. ng1.3+表单验证&lt;AngularJs&gt;
  10. Swif - 可选型