spring 中的<aop:advisor>和<aop:aspect>有什么区别?

 java配置文件如下:

<tx:advice id="txAdvice" transaction-manager="transactionManager">  
        <tx:attributes>  
            <tx:method name="save*" propagation="REQUIRED"/>  
            <tx:method name="delete*" propagation="REQUIRED"/>  
            <tx:method name="get*" read-only="true"/>  
            <tx:method name="find*" read-only="true"/>  
        </tx:attributes>  
    </tx:advice>  
    <bean id="dataAccessThrowsAdvice" class="com.XXX.XXX.aop.exception.XXX" />  
    <bean id="serviceThrowsAdvice" class="com.XXXXXX.aop.exception.XXX" />  
    <bean id="actionThrowsAdvice" class="com.XXX.XXXaop.exception.XXX" />  
     <aop:aspectj-autoproxy/>  
    <aop:config proxy-target-class="true">  
        <!-- 切面事务归txAdvice处理 -->  
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))" />  
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Manager.*(..))" />  
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.XXX..*.*Action.*(..))" />  
        <aop:advisor advice-ref="dataAccessThrowsAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))"/>  
        <aop:advisor advice-ref="serviceThrowsAdvice" pointcut="execution(* com.XXX..*.*Dao.*(..))" />  
        <aop:advisor advice-ref="actionThrowsAdvice" pointcut="execution(* com.XXX..*.*Action.*(..))" />  
    </aop:config>  
import org.springframework.aop.MethodBeforeAdvice;  
import org.springframework.aop.ThrowsAdvice;  
  
public class BaseBeforeAdvice implements MethodBeforeAdvice{  
  
    @Override  
    public void before(Method arg0, Object[] arg1, Object arg2)  
            throws Throwable {  
        System.out.println("******************");  
        System.out.println(arg0.getName());  
        System.out.println("******************");  
          
          
    }  

@Aspect  
public class wqAdvice {  
   @Pointcut("execution (* com.XX.*.XX.*(..))")  
   private void myXXCut(){}  
   @Before("myXXCut()")  
   public void doBefore(){  
       System.out.println("before");  
   }  
   @AfterReturning(pointcut="myXXCut()",returning="result")  
   public void doAfter(String result){  
       System.out.println("atfer"+result);  
   }  
   @AfterThrowing(pointcut=" myXXCut()",throwing="e")  
   public void doThrowing(Exception e){  
       System.out.println("Exception"+e.getMessage());  
   }  
}  

 

区别:

在AOP中有几个概念:
— 方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

— 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

— 通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。

— 切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点,例如,使用正则表达式。

所以“<aop:aspect>”实际上是定义横切逻辑,就是在连接点上做什么,“<aop:advisor>”则定义了在哪些连接点应用什么<aop:aspect>。Spring这样做的好处就是可以让多个横切逻辑(即<aop:aspect>定义的)多次使用,提供可重用性。

你后面的两个类实际上就是实现横切逻辑的不同方式,一种需要实现特定接口,一种以POJO + Annotation , 在功能上没有太大差别,只是方式不同。

 

 

 

转载于:https://my.oschina.net/u/3647049/blog/1510632

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值