AOP中Advisor和Aspect之间有什么区别?

时间:2014-08-02 06:24:17

标签: java spring aop

我是Spring AOP的新手。基于我的理解,我注意到Advisor(例如DefaultPointcutAdvisor)和Aspect(例如用@Aspect注释的类)都可以通过在a时做更多事情来帮助解决交叉问题。方法被调用。

这两个词有什么不同?

4 个答案:

答案 0 :(得分:8)

大多数方面都是建议的组合,用于定义 方面的行为和切入点定义方面的执行位置。

Spring认识到这一点并提供顾问,它结合了建议和切入点 成为一个对象。

更具体地说,PointcutAdvisor就是这样做的。

public interface PointcutAdvisor {
   Pointcut getPointcut();
   Advice getAdvice();
}

Spring的大多数内置切入点也有相应的PointcutAdvisor。 如果要定义切入点及其管理的建议,这很方便 在一个地方。

Spring in Action, 3rd Edition

中了解详情

Sanpshots

enter image description here enter image description here

答案 1 :(得分:2)

顾问似乎是一个旧的" AOP lite" Spring 1.5中定义的横切关注点的类型,当时Java 5的使用仍然有些不常见,因此在Spring中没有使用@AspectJ语法(通过Java注释)。对于基于模式的AOP爱好者而不是基于注释的AOP或纯AspectJ语法,这个概念仍然存在,请参阅Spring documentation on advisors

答案 2 :(得分:2)

根据我的理解,Aspect只是面向方面编程术语,而Advisor是Spring Framework行话。

也许这个简单的例子会有所帮助:

<强> Foo.java

public interface Foo {
    void foo();
    void baz();
}

<强> FooImpl.java

public class FooImpl implements Foo {
    @Override
    public void foo() {
        System.out.println("Foo!");
    }

    @Override
    public void baz() {
        System.out.println("Baz!");
    }
}

<强> MethodBeforeAdviceBarImpl.java

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class MethodBeforeAdviceBarImpl implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println("Bar!");
    }
}

最后 App.java

import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;

public class App {

    public static void main(String[] args) {
        final MethodBeforeAdvice advice = new MethodBeforeAdviceBarImpl();

        final NameMatchMethodPointcutAdvisor nameMatchMethodPointcutAdvisor = new NameMatchMethodPointcutAdvisor();
        nameMatchMethodPointcutAdvisor.setMappedName("foo");
        nameMatchMethodPointcutAdvisor.setAdvice(advice);

        final ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.addAdvisor(nameMatchMethodPointcutAdvisor);

        final Foo foo = new FooImpl();
        proxyFactory.setTarget(foo);

        final Foo fooProxy = (Foo) proxyFactory.getProxy();
        fooProxy.foo();
        fooProxy.baz();
    }
}

App.java 中运行 main 方法将输出:

Bar!
Foo!
Baz!

正如你在这里看到的那样,NameMatchMethodPointcutAdvisor是一个 Advisor ,它由 mappedName 组成,它是切入点和建议本身,在这种情况下是 MethodBeforeAdvice

在面向方面的编程术语中,一个方面是建议+切入点,所以你去......毕竟,顾问似乎是一个方面..

答案 3 :(得分:1)

Advice是您对Pointcut采取行动的方式。您可以在建议之前,之后或甚至周围使用以应用您定义的任何操作。谈论Spring Aspect,它只是一个高级别的类并合并两个概念:jointpointadvice。它可以通过基于XML的蓝图或以编程方式完成。此外,您应该指定要插入方面的点,使用Jointpoint来完成。

Spring AspectsAdvice也不能互为替代,因为Aspects只是联合点和建议的合并。