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

  • 相关阅读:
    HDU 3681 Prison Break 越狱(状压DP,变形)
    POJ 2411 Mondriaan's Dream (状压DP,骨牌覆盖,经典)
    ZOJ 3471 Most Powerful (状压DP,经典)
    POJ 2288 Islands and Bridges (状压DP,变形)
    HDU 3001 Travelling (状压DP,3进制)
    POJ 3311 Hie with the Pie (状压DP)
    POJ 1185 炮兵阵地 (状压DP,轮廓线DP)
    FZU 2204 7
    POJ 3254 Corn Fields (状压DP,轮廓线DP)
    ZOJ 3494 BCD Code (数位DP,AC自动机)
  • 原文地址:https://www.cnblogs.com/hejj-bk/p/11413614.html
Copyright © 2020-2023  润新知