<aop:aspect>与<aop:advisor>的区别

原创 2017年04月23日 15:44:12

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

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

  • < aop:aspect>:定义切面(切面包括通知和切点)
  • < 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 SleepHelperAspect{
    public void beforeSleep(){
        System.out.println("睡觉前要脱衣服!");
    }

    public void afterSleep(){
        System.out.println("起床后要穿衣服!");
    }
}

//aop配置
<bean id="sleepHelperAspect" class="com.ghs.aop.SleepHelperAspect"></bean>

<aop:config>
    <aop:pointcut expression="execution(* *.sleep(..))" id="sleepPointcut"/>
    <aop:aspect ref="sleepHelperAspect">
        <!--前置通知-->
        <aop:before method="beforeSleep" pointcut-ref="sleepPointcut"/>
        <!--后置通知-->
        <aop:after method="afterSleep" pointcut-ref="sleepPointcut"/>
    </aop:aspect>
</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>最终的实现逻辑是一样的。

小结:
可以看出,< aop:advisor>和< aop:aspect>其实都是将通知和切面进行了封装,原理基本上是一样的,只是使用的方式不同而已。

附:
对于这个问题的理解,其实尚未有一个深入的认识,下面推荐大家几篇博文,希望共同交流。
http://www.iteye.com/problems/69785
http://blog.sina.com.cn/s/blog_5198c7370100hw1p.html
http://blog.csdn.net/huitoukest/article/details/46469177
http://www.tz365.cn/ask/shenghuo/2016/0804/739237.html
https://zhidao.baidu.com/question/371238289198208804.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

spring Aop中aop:advisor 与 aop:aspect的区别

在spring的配置中,会用到这两个标签.那么他们的区别是什么呢?      //切面代码     使用配置时,     如果切面代码是自动注入的bean,那么的ref属性直接写be...
  • u011710466
  • u011710466
  • 2016年10月21日 23:34
  • 11780

spring配置aop的总结

1、java.lang.NoSuchMethodException: $Proxy 应注意:proxy-target-class="true",当bean继承了ActionS...
  • waysoflife
  • waysoflife
  • 2014年03月17日 16:33
  • 2159

spring3.0事务管理配置

第一种配置方法:基于XML的事务管理 这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxx...
  • lld2002
  • lld2002
  • 2014年12月04日 11:54
  • 317

搭建ssm框架

1.在pom.xml中替换如下的内容 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLS...
  • weixin_37176250
  • weixin_37176250
  • 2017年07月15日 14:51
  • 61

spring Aop中aop:advisor 与 aop:aspect的区别 【爱玩酷java php 学习路径】

来自 爱玩酷的java php 学习路径
  • liubag
  • liubag
  • 2017年08月04日 17:09
  • 438

Spring -- AOP入门基础&基于Aspect的AOP通知用法

动态代理我们在日常开发过程中是否会遇到下图中的这种状况 红框中的是我们要输出的日志,你是否发现,日志中大部分信息都是相同的,并且如果我们要修改一个地方,所有的地方都需要改,而且代码看起来还比较冗...
  • u010926176
  • u010926176
  • 2015年07月29日 17:04
  • 5132

Ubuntu常见问题及解决汇总

本博文将长期更新,用于记录Ubuntu下各种问题的解决办法。2015.10.11 ubuntu安装搜狗输入法: http://jingyan.baidu.com/article/ad310e80ae6...
  • ac_dao_di
  • ac_dao_di
  • 2017年02月02日 18:01
  • 1269

eclipse(maven+springmvc+spring+mybatis)(下)

eclipse(maven+springmvc+spring+mybatis)(下)
  • ajlgl
  • ajlgl
  • 2017年04月24日 16:37
  • 398

Spring的AOP(三):切入点Pointcut 、Advisor及引入

 四:切入点Pointcut 和 Advisor   1.Pointcut :一组规定,规定一个切面可以织入到哪个类的哪些方法。   2.Advisor:是一种特殊的Advice,规定了哪个切面,要织...
  • meng090914
  • meng090914
  • 2009年10月29日 20:17
  • 12447

Spring中Adivisor和Aspect的区别(自我理解)

在AOP中有几个概念:  — 方/切 面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor...
  • huitoukest
  • huitoukest
  • 2015年06月12日 11:07
  • 3378
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:<aop:aspect>与<aop:advisor>的区别
举报原因:
原因补充:

(最多只允许输入30个字)