• <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>最终的实现逻辑是一样的。

  • 相关阅读:
    linux反汇编
    Java中UML图
    Java设计模式_创建型模式_单例模式
    Javadoc注释的用法
    VIM使用技巧1
    手动破解的 Linux下的Maltab 2014b
    让vim的在输入模式下现实光标不同
    Vim 自动补全成对的括号和引号
    MAMP:在 OSX 中搭建 Apache, MySQL, PHP 环境并本地安装、调试 WordPress
    MAC+iTerm定制目录显示颜色和提示符
  • 原文地址:https://www.cnblogs.com/cristin/p/7729623.html
Copyright © 2020-2023  润新知