我无法理解内部和目标切入点指示符之间的区别。 看一下这个例子:
@Component
public interface Icamera {
public void snap() throws Exception;
}
@Component
class Camera implements Icamera{
public void snap() throws Exception {
System.out.println("SNAP!");
}
}
@Aspect
@Component
public class Logger {
**@Pointcut("within(com.test.aop.Icamera)")**
public void cameraSnap() {
}
@Before("cameraSnap()")
public void beforeAdvice() {
System.out.println("Before advice ...");
}
@After("cameraSnap()")
public void afterAdvice() {
System.out.println("After advice ...");
}
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
Icamera camera=context.getBean(Icamera.class);
camera.snap();
}
}
输出是: SNAP! 但是当你使用target而不是within时,输出是: 在建议之前...... SNAP! 建议后......
答案 0 :(得分:0)
Spring文档不是特别清楚,但它们提供了受支持的AspectJ切入点类型的完整参考:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-pointcuts
如果是你的例子
中的- 限制在某些类型中连接点的匹配(只是在使用Spring AOP时执行在匹配类型中声明的方法)
因此,接收方法调用的实际@Component
的类型应与within
中的选择器匹配。如果指定bean类名
@Pointcut("within(com.test.aop.Camera)")
包裹选择器
@Pointcut("within(com.test.aop.*)")
或带有子包选择器的某个父包
@Pointcut("within(com.test..*)")
target - 限制匹配连接点(使用Spring AOP时执行方法),其中目标对象(被代理的应用程序对象)是给定类型的实例
正如文档建议适用于<beanClass> instanceof <targetType>
评估为true
的所有bean的方法调用。