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

我是Spring AOP的新手。 根据我的理解,我注意到Advisor(例如DefaultPointcutAdvisor )和Aspect(例如使用@Aspect注释的类)都可以通过在调用方法时执行更多操作来帮助解决交叉问题。

请问这两个学期有什么不同?

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

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

大多数方面是定义方面行为的建议和定义方面应执行位置的切入点组合

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

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

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

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

阅读Spring in Action,第3版

Sanpshots

在此处输入图像描述在此处输入图像描述

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

在我的理解中,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组成,它是切入点和Advice本身,在本例中是MethodBeforeAdvice

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