您的位置:首页 > 编程语言 > Java开发

一个用Spring AOP实现异常处理和记录程序执行时间的实例(二)

2009-11-26 11:41 966 查看
5.11.12使用ProxyFactoryBean代理定义配置文件config.xml
改写Spring的配置文件 exception_config.xml,主要用来使用Spring的ProxyFactoryBean代理功能,对Logic1.java只记录程序执行时间,不捕获发生的异常,对Logic2.java只捕获发生的异常,不记录程序执行时间,去掉前面的自动代理。 exception_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="exceptionHandler" class="com.gc.action.ExceptionHandler"/>

<bean id="exceptionHandlereAdvisor" class="org.springframework.aop.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>
<bean id="logic1Proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.gc.impl.LogicInterface</value>
</property>
<property name="target">
<ref bean="logic1"/>
</property>
<!--指定代理类-->
<property name="interceptorNames">
<list>
<value>timeHandlerAdvisor</value>
</list>
</property>
</bean>
<bean id="logic2Proxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyTargetClass">
<value>true</value>
</property>
<property name="target">
<ref bean="logic2"/>
</property>
<!--指定代理类-->
<property name="interceptorNames">
<list>
<value>exceptionHandler</value>
</list>
</property>
</bean>
</beans>
5.11.13编写测试类Logic1的程序TestAop.java
这里先改写对业务逻辑Logic1.java的演示。TestAop.java的示例代码如下:
//******* TestAop.java**************
package com.gc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.gc.impl.LogicInterface;
public class TestAop {
public static void main(String[ ] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//通过ApplicationContext获取配置文档
ApplicationContext actx=new FileSystemXmlApplicationContext("exception_config.xml");
LogicInterface logic = (LogicInterface)actx.getBean("logic1Proxy");
//模拟执行新增、修改和删除方法
try {
logic.doInsert("张三");
logic.doUpdate("李四");
logic.doDelete("王五");
} catch (Exception ex) {

}
}
}
5.11.15编写测试类Logic2的程序TestAop.java
上面主要是针对业务逻辑Logic1.java的测试,所以在记录的信息中,只显示了每个方法的执行时间,而没有捕获删除方法抛出的异常信息,对于业务逻辑Logic2.java的测试,使其只捕获删除方法抛出的信息,而不记录每个方法执行的时间,需要修改测试代码TestAop.java。TestAop.java的示例代码如下:
//******* TestAop.java**************
package com.gc.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.gc.action.Logic2;
public class TestAop {
public static void main(String[ ] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//通过ApplicationContext获取配置文档
ApplicationContext actx=new FileSystemXmlApplicationContext("exception_config.xml");
Logic2 logic2 = (Logic2)actx.getBean("logic2Proxy ");
//模拟执行新增、修改和删除方法
logic2.doInsert("张三");
logic2.doUpdate("李四");
logic2.doDelete("王五");
}
}
5.12 小 结
本章首先从AOP的基本思想讲起,接着对Java的动态代理机制进行了讲解,然后讲解了AOP的3个重要概念,又使用不同的通知分别实现了日志输出的示例,最后通过一个完整的实例使读者更全面地了解了Spring中的AOP。
因为AOP在技术和思想上都还没有完全成熟,如果大量地应用AOP可能会有一定的负面作用,可能会达不到开发者的初衷,使得代码更难以理解。因此,要适度地使用AOP。
总的来说,AOP编程的实质就是:业务逻辑不再实现横切关注点,而是由单独的类来封装。当业务逻辑需要用到封装的横切关注点时,AOP会自动把封装的横切关注点插入到具体的业务逻辑中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐