`
wxb880114
  • 浏览: 684011 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring AOP之ThrowsAdvice

阅读更多
目前的项目中接触了一些Spring的AOP的部分,比如声明式事务管理。

1.  几个重要的概念(详细的情况参见Spring的在线文档)

·         PointCut:一组JointPoint。在Spring中我们可以通过一些正则表达式定义那些JointPoint组成了我们需要的一个PointCut,从而使我们的Advice可以被编制进来。

·         Introduction:Introduction可以我们在已经存在的类中在不修改这个类的情况下增加属性和方法,从而增加其状态和动作;

·         Target:满足PointCut定义的条件的一个类,我们可以把Advice用于这个类。大多Spring的AOP是通过动态代理的机制实现的,这个Target就是那个被代理的对象;

·         Proxy:为了将一个Advice应用到另外一个类中,比如实现Around Advice,就是在一个方法执行前后加上其他的代码,那么实际的实现一定是先执行一段Advice的代码,然后执行Target的那个方法,之后再执行一段Advice的代码,也就是客户端执行某个类的时候,实际执行的是一个代理,由代理再把调用传递到那个Target中。

·         Weaving(编织):有了Target和Advice,在什么时机将这两个模块编织在一起呢?可以选择的方法包括编译的时候(这样我们需要一个特殊的编译器),装载类的时候(这样我们需要一个特殊的ClassLoader)和运行的时候(AOP容易可以动态的创建一个代理从而将调用由这个代理传递到Target类中)。

2. Throws Advice
目前的项目中有这么一个要求,对于某些处理流程如果在运行的时候抛出了一些异常,需要将这些异常的信息记录下来,保存在数据库或发邮件给开发人员。我们切不说这个需求跟TDD有什么冲突的地方,先看看如何实现吧。

按照上面概念的描述,我们应该主要注意三个概念:Target,Advice和Proxy。

2.1 Target的实现
Target就是上面所说的业务流程类,我们按照正常的开发编写代码即可,没有什么特殊的要求。如:

public interface IBizProcess {
    void doOneThing();
    void doAnotherThing();    
}
public class BizProcessImpl {
    public void doOneThing() {
    }
    public void doAnotherThing() {
        throw new RuntimeException("Boom");
    }
}

2.2 Advice
为了实现当业务流程抛出异常时的Advice,我们需要定义个一个Advice类,实现ThrowsAdvice接口。这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法,如下:

public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );
这个方法的前面三个参数都是可选的。我们在同一个类中定义这个方法的多个版本,如:

public void afterThrowing( MyException1 ex ) {}
public void afterThrowing( MyException2 ex ) {}
具体那个方法被调用则根据具体的Exception来判断,由AOP容易自动识别执行。
2.3 Proxy(代理)
Spring中一个简单的实现是用它的org.springframework.aop.framework.ProxyFactoryBean。这个Bean包含了很多个属性,其中有三个我们需要设置:target,proxyInterfaces和interceptorNames,如下:
<bean id=”bizOneTarget” class=”com.company.biz.impl.BizProcessImpl”/>
<bean id=”throwsAdvice” class=”com.company.advice.MyThrowsAdvice”/>
<bean id=”bizOne” class=”org.springframework.aop.framework.ProxyFactoryBean”>
            <property name=”target”><ref bean=”bizOneTargte”/></property>
            <property name=”proxyInterfaces”>
                        <value>com.company.biz.IBizProcessImpl</value>
            </property>
            <property name=”interceptorNames”>
                        <list>
                                    <value>throwsAdvice</value>
                        </list>
            </property>
</bean>
通过上面的配置,Spring就把Target和Advice编织在了一起。需要说明的是,proxyInterfaces和interceptorNames都可以是多个,如果是多个的话就需要用list来定义。interceptorNames的先后次序决定了这些Advice执行的先后次序。
3. 简化配置
从上面的例子可以看出,如果有多个BizProcess的对象需要代理,我们在Spring配置中为每一个Bean都配置一个代理,那么配置文件的维护就成了麻烦。为此,Spring提供了比较方便的方法解决这个问题,比如BeanNameAutoProxyCreator、DefaultAdviceAutoProxyCreator和metadata autoproxying。我们采用了BeanNameAutoProxyCreator,因为他比较直观和简单。
配置如下:
<bean id=”beanNameAutoProxyCreator” class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>
            <property name=’beanNames”>
                        <list>
                                    <value>*Service</value>
                        </list>
            </property>
            <property name=”interceptorNames”>
                        <value>throwsAdvice</value>
            </property>
</bean>
从中我们可以看到,所有以Service结尾的bean都会由Spring自动创建代理,从而实现Advice的织入。
分享到:
评论

相关推荐

    小马哥讲 Spring AOP 编程思想 - API 线索图.pdf

    在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...

    Spring_AOP_学习小结 Spring_AOP_学习小结 Spring_AOP_学习小结

    Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...

    Spring  AOP实现方法大全

    Spring提供了`.ThrowsAdvice`接口来实现此类Advice。 随着Spring的发展,除了使用XML配置,还引入了基于注解的AOP,使得配置更加简洁。例如,使用`@Before`、`@After`、`@Around`和`@Throws`注解可以直接在方法上...

    spring aop 拦截器简单实现

    它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,可以在方法调用前后执行自定义逻辑。...

    Spring AOP - Advice

    在Spring中,我们使用`org.springframework.aop.ThrowsAdvice`接口。例如: ```java public class ExceptionAdvice implements ThrowsAdvice { @AfterThrowing(pointcut = "execution(* com.example.service.*.*...

    spring-aop源码解读

    Spring提供了多种类型的Advice,包括MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。 2. Pointcut(切点): Pointcut是识别哪些连接点需要应用Advice的规则或模式。它定义了哪些方法应该被增强。在...

    spring aop 实例

    当方法抛出异常时,与之关联的ThrowsAdvice会触发。我们可以通过实现`ThrowsAdvice`接口,然后定义一系列以`throws`开头的方法,每个方法对应一种可能的异常类型。当目标方法抛出匹配的异常时,相应的`throws`方法会...

    Spring ThrowsAdvice使用例子

    在Java世界中,Spring框架是应用最广泛的轻量级框架之一,它提供了众多特性来简化企业级应用的开发。在Spring中,`ThrowsAdvice`是一个重要的概念,它用于处理异常,提供了一种灵活的方式来增强方法的异常处理逻辑。...

    SpringAOP的日志拦截示例

    首先,我们需要创建一个拦截器类,这个类通常会实现Spring的`MethodBeforeAdvice`、`AfterReturningAdvice`或`ThrowsAdvice`接口,或者自定义一个Advisor。在这个案例中,文件名为`LogInterceptor.java`的类可能是...

    spring AOP 概念

    ### Spring AOP 概念详解 #### 一、AOP基本概念 **Spring AOP** 是基于面向切面编程(Aspect Oriented Programming)的一种技术,主要用于处理横切关注点问题,比如日志记录、安全控制、事务管理等功能,这些功能...

    Spring 应用之AOP

    ### Spring应用中的AOP详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,提高系统的模块化程度。在...

    spring入门学习-6、AOP几种配置方式详解.pdf

    基于代理的经典 AOP 是 Spring 最早提供的 AOP 实现方式之一。它主要通过 `ProxyFactoryBean` 来创建代理对象。`ProxyFactoryBean` 是 Spring 提供的一个工厂 Bean,用于创建 AOP 代理对象。 - **按方法名字匹配**...

    aop的详细总结(包含例子)

    5. Weaving(编织):将切面应用到目标对象的过程,Spring AOP在运行时完成这个过程,通过ProxyFactory或ProxyFactoryBean。 二、AOP种类 1. 静态织入:在编译时完成,如AspectJ。 2. 动态织入:运行时进行,Spring...

    基于spring_aop_权限管理系统原型

    首先,Spring AOP提供了多种通知类型,包括`MethodBeforeAdvice`、`AfterReturningAdvice`和`ThrowsAdvice`。`MethodBeforeAdvice`在目标方法执行前调用,`AfterReturningAdvice`在方法正常返回后调用,而`...

    spring_教程_2_AOP

    Spring AOP(Aspect Oriented Programming)是Spring框架的核心特性之一,它允许程序员实现关注点分离,将横切关注点(如日志、事务管理、安全检查)从核心业务逻辑中解耦出来。在AOP中,横切关注点被称为切面,而...

    spring的Aop中的前置通知,后置通知以及环绕通知简单代码

    它们可以通过实现`org.springframework.aop.AfterReturningAdvice`和`org.springframework.aop.ThrowsAdvice`接口来创建,或者使用`@AfterReturning`和`@AfterThrowing`注解。 ```java @Aspect public class ...

    Spring的AOP

    **Spring的AOP**是Spring框架的一个核心特性,它提供了面向切面编程的能力,使得开发者可以将关注点从主要业务逻辑中分离出来,比如事务管理、日志记录、安全控制等。AOP允许我们在不修改原有业务代码的情况下,增强...

    如何使用Spring AOP的通知类型及创建通知

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。本文将深入探讨Spring AOP中的通知类型及其创建方法,帮助你更好地理解和...

Global site tag (gtag.js) - Google Analytics