Spring - 通知(Advice)和顾问(Advisor)

来源:互联网 发布:国泰君安港股交易软件 编辑:程序博客网 时间:2024/05/18 05:01

【1】AOP (Aspect Oriented Programming 面向切面编程)

    • 首先回顾基本术语:

(1)切面(Aspect)

切面泛指[交叉业务逻辑]。事务处理和日志处理可以理解为切面。常用的切面有通知(Advice)与顾问(Advisor)。实际就是对主业务逻辑的一种增强。

(2)织入(Weaving)

织入是指将切面代码插入到目标对象的过程。代理的invoke方法完成的工作,可以称为织入。

(3) 连接点(JoinPoint)

程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
连接点由两个信息确定:

方法(表示程序执行点,即-在哪个目标方法);相对点(表示方位,即-目标方法的什么位置,如调用前、后。。。)

每个类都拥有多个连接点.
例如 ArithmethicCalculator(本地测试类) 的所有方法实际上都是连接点,即连接点是程序类中客观存在的事务。

(4)切入点(PointCut)

切入点指切面具体织入的方法
注意:被标记为final的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的。

类比:连接点相当于数据库中的记录,切点相当于查询条件。

切点和连接点不是一对一的关系,一个切点匹配多个连接点.

切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。

(5)目标对象(Target)

目标对象指将要被增强的对象。即包含主业务逻辑的类的对象。

(6)通知(Advice)

通知是切面的一种实现,可以完成简单的织入功能。通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是执行之后执行等。切入点定义切入的位置,通知定义切入的时间。

(7)顾问(Advisor)

顾问是切面的另一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。

【2】Aspect

使用<aop:aspect>配置时,
如果切面代码是自动注入的bean,那么<aop:aspect>的ref属性直接写bean的注入名字就可以了!

<bean id="validateAspect" class="com.web.aop.impl.xml.ValidateAspect"></bean><!-- 配置验证切面 -->        <aop:aspect  ref="validateAspect" order="2" >            <aop:before method="beforMethod" pointcut-ref="pointcut"/>        </aop:aspect>

【3】Advisor

如,Spring中的事务应用:

    <!-- *************2.配置事务属性 *********************-->    <tx:advice id="txadvice" transaction-manager="transactionManager" >        <tx:attributes>            <!-- 根据方法名指定事务的属性 -->            <tx:method name="purchase" propagation="REQUIRES_NEW" isolation="READ_COMMITTED"  />            <tx:method name="*"/>        </tx:attributes>    </tx:advice>    <!-- ***3.配置事务切入点,以及把事务切入点和事务属性关联起来 -->    <aop:config>        <aop:pointcut expression="execution(* com.web.xml.service.*.*(..))" id="txPointCut"/>        <aop:advisor advice-ref="txadvice" pointcut-ref="txPointCut" />    </aop:config>

<aop:advisor advice-ref="beanName" pointcut-ref="txPointCut" />
则该bean的class应为org.aopalliance.aop.Advice类型

1、Adivisor是一种特殊的Aspect,Advisor代表spring中的Aspect
<aop:advisor>:用来定义只有一个通知和一个切入点的切面;
<aop:aspect>:用来定义切面,该切面可以包含多个切入点和通知,而且标签内部的通知和切入点定义是无序的;和advisor的区别就在此,advisor只包含一个通知和一个切入点。

0 0