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