`

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

阅读更多
<aop:aspect>与<aop:advisor>的区别
2017年04月23日 15:44:12
阅读数:14086
在开发过程中,不少有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>其实都是将通知和切面进行了封装,原理基本上是一样的,只是使用的方式不同而已。
分享到:
评论

相关推荐

    SPRING:aspect和advisor区别

    ### Spring中的Aspect与Advisor区别详解 #### 一、引言 在Spring框架中,面向切面编程(AOP)是一种非常强大的技术,它允许开发者将横切关注点(如日志记录、安全性检查等)从业务逻辑中分离出来。本文旨在深入...

    使用Spring配置文件实现AOP

    在Spring框架中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种强大的设计模式,它允许我们定义横切关注点,如日志、事务管理、权限检查等,然后将这些关注点与核心业务逻辑解耦。这篇教程将详细讲解...

    com.springsource.org.aopalliance-1.0.0.jar.zip

    在Spring配置中,我们可以通过`&lt;aop:config&gt;`标签来定义切面,然后使用`&lt;aop:advisor&gt;`或`&lt;aop:aspect&gt;`来指定拦截器。例如: ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ref="loggingInterceptor"&gt; ...

    spring aop管理xml版

    - `&lt;aop:advisor&gt;`:可以包含一个通知和一个切入点,是更细粒度的配置单元。 在实际应用中,我们会在`&lt;bean&gt;`元素中定义切面类,并在`&lt;aop:config&gt;`中通过`&lt;aop:aspect&gt;`元素引用它,然后定义相应的通知和切入点。...

    springAop的配置实现

    - `&lt;aop:advisor&gt;`:定义通知和切入点的关联,指定何时何地执行通知。 - `&lt;aop:aspect&gt;`:定义切面,包括其通知和切入点。 - `&lt;aop:before&gt;`、`&lt;aop:after&gt;`、`&lt;aop:around&gt;`等:分别用于定义不同类型的通知。 **5....

    springAOP配置动态代理实现

    1. **XML配置**:在Spring的配置文件中,可以通过&lt;aop:config&gt;标签来定义切面,&lt;aop:pointcut&gt;定义切点,&lt;aop:advisor&gt;或&lt;aop:aspect&gt;定义通知。例如: ```xml &lt;aop:config&gt; &lt;aop:pointcut id="myPointcut" ...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    3. **关联通知与切点**: 使用`&lt;aop:pointcut&gt;`定义切点,并通过`&lt;aop:advisor&gt;`将通知与切点关联起来。 例如: ```xml &lt;aop:config&gt; &lt;aop:pointcut id="myPointcut" expression="execution(* com.example.service....

    SpringAOP1.zip

    在Spring配置文件中,我们可以使用`&lt;aop:config&gt;`元素来声明切面,`&lt;aop:pointcut&gt;`定义切点,`&lt;aop:advisor&gt;`或`&lt;aop:aspect&gt;`定义通知。 例如,下面是一个简单的切面定义: ```xml &lt;aop:config&gt; &lt;aop:pointcut ...

    spring2.5.6 aop简单示例

    &lt;aop:advisor advice-ref="loggingAdvice" pointcut-ref="myBusinessMethods"/&gt; ``` 4. **编写通知逻辑**:在服务类中,我们可以定义一个方法作为通知,如`@Before`、`@After`、`@Around`等注解的方法。例如,一...

    SpringAOP实现.docx

    &lt;aop:aspect ref="diy"&gt; &lt;aop:pointcut id="pointcut" expression="execution(* com.spong.demo03.UserServiceImpl.*(..))"/&gt; &lt;aop:before method="logBefore" pointcut-ref="pointcut"/&gt; &lt;aop:after method=...

    spring_aop xml方式实现aop

    使用`&lt;aop:advisor&gt;`标签来定义顾问: ```xml &lt;aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/&gt; ``` 在这里,`advice-ref`属性引用了之前定义的通知ID。 总结来说,通过Spring的XML配置,我们可以...

    使用Spring的声明式事务----AOP方式

    1. XML配置:在`&lt;tx:advice&gt;`元素中定义事务行为,然后通过`&lt;aop:config&gt;`或`&lt;aop:aspect&gt;`将事务行为应用到特定的bean或方法上。例如: ```xml &lt;tx:advice id="transactionAdvice" transaction-manager=...

    SpringAop实例

    例如,我们可以通过`&lt;aop:config&gt;`标签来开启AOP支持,然后使用`&lt;aop:pointcut&gt;`定义切入点,`&lt;aop:advisor&gt;`或`&lt;aop:aspect&gt;`定义通知。这种方式清晰地将切面逻辑分离出来,有利于团队协作和代码维护。 2. 注解...

    aop配置demo

    接着,使用`&lt;aop:advisor&gt;`或`&lt;aop:aspect&gt;`标签来创建通知,通知是实际的切面逻辑,可以在方法调用前后执行。`&lt;aop:before&gt;`、`&lt;aop:after&gt;`、`&lt;aop:around&gt;`和`&lt;aop:after-throwing&gt;`分别对应于前置通知、后置通知...

    spring aop xml 实例

    &lt;aop:advisor advice-ref="myAdvice" pointcut-ref="myPointcut"/&gt; &lt;/aop:config&gt; &lt;aop:aspect id="myAspect"&gt; &lt;!-- 定义通知 --&gt; &lt;aop:before method="beforeMethod" pointcut-ref="myPointcut"/&gt; &lt;aop:after-...

    springAOP所需jar包

    XML配置通常在Spring的配置文件中完成,如`&lt;aop:config&gt;`标签用于开启AOP支持,`&lt;aop:aspect&gt;`定义切面,`&lt;aop:pointcut&gt;`定义切点,`&lt;aop:advisor&gt;`定义通知。注解方式则更简洁,可以使用`@Aspect`、`@Before`、`@...

    AOP基础与配置

    在Spring的XML配置文件中,可以使用`&lt;aop:config&gt;`和`&lt;aop:aspect&gt;`标签来定义切面和通知。 - `&lt;aop:config&gt;`:开启AOP配置。 - `&lt;aop:pointcut&gt;`:定义切点表达式。 - `&lt;aop:advisor&gt;`:创建一个通知,关联切点和...

    spring famework 基于xml配置aop示例

    使用`&lt;aop:advisor&gt;`标签,将切点和通知组合在一起: ```xml &lt;aop:advisor advice-ref="myAdvice" pointcut-ref="serviceMethods"/&gt; ``` 这里的`advice-ref`引用了之前定义的通知,`pointcut-ref`引用了切点。 在...

    征服Spring AOP—— Schema

    3. `&lt;aop:advisor&gt;`:顾问元素,它将切入点与通知关联起来。顾问包含了何时以及如何执行通知的信息。 4. `&lt;aop:aspect&gt;`:定义一个切面,可以包含多个通知和切入点。切面可以看作是封装了多个相关通知的逻辑单元。 ...

    Spring AOP实现

    Spring AOP的配置通常在Spring的XML配置文件中完成,通过`&lt;aop:config&gt;`标签开启AOP支持,然后使用`&lt;aop:advisor&gt;`定义Advisor,指定advice和pointcut。在例子中,BeanImpl类的theMethod()方法会在执行前调用`...

Global site tag (gtag.js) - Google Analytics