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

作者:爱上香锅的麻辣 时间:2023-01-22 21:53:35 

在开发过程中,不少有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>其实都是将通知和切面进行了封装,原理基本上是一样的,只是使用的方式不同而已。

来源:https://blog.csdn.net/u011983531/article/details/70504281

标签:aop,aspect,advisor
0
投稿

猜你喜欢

  • SpringBoot整合MybatisPlus的教程详解

    2023-12-06 18:05:20
  • Android中三种注入事件方法比较

    2022-11-20 18:17:23
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    2022-07-13 22:39:25
  • Flutter Widgets之标签类控件Chip详解

    2023-06-26 14:22:35
  • Java基于命令模式实现邮局发信功能详解

    2023-07-03 04:57:25
  • 一文带你认识Java中的Object类和深浅拷贝

    2023-02-05 16:52:08
  • C#中重载与重写区别分析

    2023-11-01 17:43:05
  • java反射机制示例详解

    2021-08-07 07:51:59
  • Java String 字符串常量池解析

    2023-01-08 19:44:05
  • 详细介绍idea如何设置类头注释和方法注释(图文)

    2022-05-08 20:22:41
  • java中使用xls格式化xml的实例

    2023-06-13 09:43:07
  • Android自定义加载圈的方法

    2023-07-16 14:38:46
  • Java Http请求方式之RestTemplate常用方法详解

    2021-06-29 02:32:51
  • idea maven pom不自动更新的解决方法

    2021-11-19 14:56:46
  • idea搭建SSM框架遇踩的坑(附完整过程)

    2023-06-23 09:53:07
  • Android实现LED发光字效果

    2021-09-14 21:58:12
  • Android底部菜单简单应用

    2022-03-25 18:09:58
  • mybatis如何批量添加一对多中间表

    2021-08-26 03:16:41
  • Mybatis 动态sql的编写与开启二级缓存

    2023-12-12 11:59:08
  • SpringBoot 多Profile使用与切换方式

    2022-04-13 14:58:27
  • asp之家 软件编程 m.aspxhome.com