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

    原出处:https://blog.csdn.net/u011983531/article/details/70504281

    转自:https://www.jianshu.com/p/40f79da0cdef

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

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

    • < aop:aspect>:定义切面(切面包括通知和切点)
    • < aop:advisor>:定义通知器(通知器跟切面一样,也包括通知和切点)

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

    1、实现方式不同

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

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

    public interface ISleepAdvisorable
    {
    public void sleep(String name);
    }


    public class SleepImplAdvisor implements ISleepAdvisorable
    {
    private String name;

    @Override
    public String sleep(String name) {
    System.out.println("I'm sleeping!");
    return "sleep";
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    }

    创建一个通知类,代码如下:

    public class AopAdvisorHelper implements MethodBeforeAdvice,AfterReturningAdvice
    {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable
    {
    System.out.println("类"+target+"执行了"+method.getName()+"方法。");
    //数据库做一个插入操作
    }

    /**
    * returnValue 方法返回值
    * method 执行的方法
    * args 执行方法的参数
    * target 执行的类
    */
    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable
    {
    System.out.println("类"+target+"执行了"+method.getName()+"方法。");
    }

    }

    创建spring-aop.xml文件,配置如下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <!-- 开启注解扫描 -->
    <context:component-scan base-package="cn.ffcs.msa.springAop.four.aop.advisor"/>
    <!-- aop配置 -->
    <bean id="aopAdvisorHelper" class="cn.ffcs.msa.springAop.four.aop.advisor.AopAdvisorHelper"></bean>

    <aop:config>
    <aop:pointcut id="sleepPointcut" expression="execution(* cn.ffcs.msa.springAop.four.aop.advisor.*.*(..))"/>
    <aop:advisor pointcut-ref="sleepPointcut" advice-ref="aopAdvisorHelper" />
    </aop:config>
    <bean id="human" class="cn.ffcs.msa.springAop.four.aop.advisor.SleepImplAdvisor"/>
    <!-- <bean id="carable" class="cn.ffcs.msa.springAop.four.aop.advisor.CarableAdvisorImpl"/> -->
    </beans>

    测试类如下

    public class App {

    public static void main(String[] args) {
    method1();
    }

    //aop-advisor实现aop拦截
    private static void method1()
    {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-aop.xml");
    ISleepAdvisorable sleeper = (ISleepAdvisorable) context.getBean("human");
    sleeper.sleep("human");
    System.out.println("=======================================");
    ICarAdvisorable car = (ICarAdvisorable) context.getBean("carableAdvisorImpl");
    car.byCar();
    }
    }

    ==================================================================================

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

    首先,我们定义一个接口ISleepAdvisorable和这个接口的实现SleepImplAdvisor,代码如下:

    public interface ISleepAspectable
    {
    String sleep(String name);
    }

    public class HumanAspect implements ISleepAspectable
    {
    private String name;

    @Override
    public String sleep(String name) {
    System.out.println("I'm sleeping!");
    return "sleep";
    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }

    创建通知类,代码如下:

    public class AopAspectHelper
    {
    public void aopBefore(JoinPoint joinPoint)
    {
    System.out.println(joinPoint.getSignature().getName());
    System.out.println(joinPoint.getTarget());
    System.out.println(Arrays.toString(joinPoint.getArgs()));
    System.out.println("read to sleep !");
    //数据库做一个插入操作
    }

    /**
    * returnValue 方法返回值
    * method 执行的方法
    * args 执行方法的参数
    * target 执行的类
    */
    public void aopAfter(JoinPoint joinPoint)
    {
    System.out.println("I'm awake.");
    }

    }

    创建spirng-aop2配置文件,配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">

    <bean id="human" class="cn.ffcs.msa.springAop.four.aop.aspect.HumanAspect"/>
    <bean id="carable" class="cn.ffcs.msa.springAop.four.aop.aspect.CarableAspectImpl"/>
    <bean id="aopAspectHelper" class="cn.ffcs.msa.springAop.four.aop.aspect.AopAspectHelper"/>

    <aop:config>
    <aop:pointcut id="aopPointcut" expression="execution(* cn.ffcs.msa.springAop.four.aop..*.*(..))"/>
    <aop:aspect ref="aopAspectHelper">
    <!--前置通知-->
    <aop:before method="aopBefore" pointcut-ref="aopPointcut"/>
    <!--后置通知-->
    <aop:after method="aopAfter" pointcut-ref="aopPointcut" />
    </aop:aspect>
    </aop:config>
    </beans>

    项目用到的maven的jar包管理如下:

    <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.2</version>
    </dependency>

    2、使用场景不同
    < aop:advisor>大多用于事务管理。
    例如:

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

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

  • 相关阅读:
    [灵魂拷问]MySQL面试高频100问(工程师方向)
    前后端分离模式下的权限设计方案
    Netty实战:设计一个IM框架
    超实用,Linux中查看文本的小技巧
    Java面试,如何在短时间内做突击
    挑战10个最难回答的Java面试题(附答案)
    SpringBoot是如何动起来的
    Lab_2_SysOps_VPC_Linux_v2.5
    Lab_1_SysOps_Compute_Linux_v2.5
    change-resource-tags.sh
  • 原文地址:https://www.cnblogs.com/hejj-bk/p/11413614.html
Copyright © 2011-2022 走看看