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

本文通过具体示例详细介绍了如何利用 Spring 的 AOP 功能进行方法执行时间和异常捕获的控制。通过对两个业务逻辑类 Logic1 和 Logic2 的不同配置,展示了如何仅记录方法执行时间或仅捕获异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

5.11.12  使用ProxyFactoryBean代理定义配置文件config.xml

改写Spring的配置文件 exception_config.xml,主要用来使用SpringProxyFactoryBean代理功能,对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.javaTestAop.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的动态代理机制进行了讲解,然后讲解了AOP3个重要概念,又使用不同的通知分别实现了日志输出的示例,最后通过一个完整的实例使读者更全面地了解了Spring中的AOP

因为AOP在技术和思想上都还没有完全成熟,如果大量地应用AOP可能会有一定的负面作用,可能会达不到开发者的初衷,使得代码更难以理解。因此,要适度地使用AOP

总的来说,AOP编程的实质就是:业务逻辑不再实现横切关注点,而是由单独的类来封装。当业务逻辑需要用到封装的横切关注点时,AOP会自动把封装的横切关注点插入到具体的业务逻辑中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值