我是Spring AOP的新手。基于我的理解,我注意到Advisor(例如DefaultPointcutAdvisor
)和Aspect(例如用@Aspect
注释的类)都可以通过在a时做更多事情来帮助解决交叉问题。方法被调用。
这两个词有什么不同?
答案 0 :(得分:8)
大多数方面都是建议的组合,用于定义 方面的行为和切入点定义方面的执行位置。
Spring认识到这一点并提供顾问,它结合了建议和切入点 成为一个对象。
更具体地说,PointcutAdvisor
就是这样做的。
public interface PointcutAdvisor {
Pointcut getPointcut();
Advice getAdvice();
}
Spring的大多数内置切入点也有相应的PointcutAdvisor
。
如果要定义切入点及其管理的建议,这很方便
在一个地方。
在Spring in Action, 3rd Edition
中了解详情Sanpshots
答案 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
,它只是一个高级别的类并合并两个概念:jointpoint
和advice
。它可以通过基于XML的蓝图或以编程方式完成。此外,您应该指定要插入方面的点,使用Jointpoint
来完成。
Spring Aspects
和Advice
也不能互为替代,因为Aspects只是联合点和建议的合并。