zoukankan      html  css  js  c++  java
  • <aop:aspect>与<aop:advisor>的区别

    在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会使用< aop:advisor>。那么,对于< aop:aspect>与< aop:advisor>的区别,具体是怎样的呢?

    至于两者的区别,网上有很多资料,但是似乎都不能说清楚。 
    首先,我们需要明确两者的概念。

    • < aop:aspect>:定义AOP通知器
    • < aop:advisor>:定义切面

    下面,我们列举两者的几个区别。

    1、实现方式不同

    < aop:aspect>定义切面时,只需要定义一般的bean就行,而定义< aop:advisor>中引用的通知时,通知必须实现Advice接口。

    下面我们举例说明。 
    首先,我们定义一个接口Sleepable和这个接口的实现Human,代码如下:

    public interface Sleepable {
        public void sleep();
    }
    
    public class Human implements Sleepable {
    
        @Override
        public void sleep() {
            System.out.println("我要睡觉了!");
        }
    }

    下面是< aop:advisor>的实现方式:

    //定义通知
    public class SleepHelper implements MethodBeforeAdvice,AfterReturningAdvice{
        @Override
        public void before(Method arg0, Object[] arg1, Object arg2)
                throws Throwable {
            System.out.println("睡觉前要脱衣服!");
        }
    
        @Override
        public void afterReturning(Object arg0, Method arg1, Object[] arg2,
                Object arg3) throws Throwable {
            System.out.println("起床后要穿衣服!");
        }
    }
    
    //aop配置
    <bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>
    
    <aop:config>
        <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
        <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
    </aop:config>
    
    <bean id="human" class="com.ghs.aop.Human"/>

    下面是< aop:aspect>的实现方式:

    //定义切面
    public class SleepHelper2{
        public void beforeSleep(){
            System.out.println("睡觉前要脱衣服!");
        }
    
        public void afterSleep(){
            System.out.println("起床后要穿衣服!");
        }
    }
    
    //aop配置
    <bean id="sleepHelper" class="com.ghs.aop.SleepHelper"></bean>
    
    <aop:config>
        <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
        <aop:advisor advice-ref="sleepHelper" pointcut-ref="sleepPointcut"/>
    </aop:config>
    
    <bean id="human" class="com.ghs.aop.Human"/>

    测试代码如下:

    public class TestAOP {
        public static void main(String[] args) {
            method1();
    //      method2();
        }
    
        private static void method1() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext1.xml");
            Sleepable sleeper = (Sleepable) context.getBean("human");
            sleeper.sleep();
        }
    
        private static void method2() {
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
            Sleepable sleeper = (Sleepable) context.getBean("human");
            sleeper.sleep();
        }
    
    //执行结果
    睡觉前要脱衣服!
    我要睡觉了!
    起床后要穿衣服!
    }

    2、使用场景不同

    < aop:advisor>大多用于事务管理。 
    例如:

    <!-- 会重复读,不会脏读事务 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" timeout="120" propagation="REQUIRED" rollback-for="Exception" />
        </tx:attributes>
    </tx:advice>
    
    <aop:config proxy-target-class="true">
        <aop:pointcut id="txPointCut" expression="..."/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
    </aop:config>

    < aop:aspect>大多用于日志,缓存

    其实,不管是< aop:advisor>还是< aop:aspect>最终的实现逻辑是一样的。

  • 相关阅读:
    远程桌面工具mRemoteNG与Tsmmc
    敏感性Sensitivity和特异性Specificity的说明
    React教程:4 个 useState Hook 示例
    React Hooks究竟是什么呢?
    一步一步搭建前端监控系统:如何监控资源加载错误?
    Promise的三兄弟:all(), race()以及allSettled()
    JavaScript中this究竟指向什么?
    编译器与Debug的传奇:Grace Murray Hopper小传
    21个React开发神器
    8种常见数据结构及其Javascript实现
  • 原文地址:https://www.cnblogs.com/cristin/p/7729623.html
Copyright © 2011-2022 走看看