我无法理解内部切入点指示符与目标切入点指示符之间的区别。
看例子:
@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();
}
}
输出为:快点!但是当您使用target而不是内部时,输出为:建议之前...快点!经过咨询...
Spring文档不是特别清楚,但是它们提供了对受支持的AspectJ切入点类型的完整参考:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#aop-pointcuts
在您的示例中
inin-限制匹配到某些类型内的连接点(仅在使用Spring AOP时执行在匹配类型内声明的方法)
因此,接收方法调用的实际@Component
的类型应与within
中的选择器匹配。如果您指定bean类名,它将拦截该调用。
@Pointcut("within(com.test.aop.Camera)")
程序包选择器
@Pointcut("within(com.test.aop.*)")
或带有子包选择器的某些父包
-限制匹配连接点(使用Spring AOP时方法的执行),其中目标对象(代理的应用程序对象)是给定类型的实例]]@Pointcut("within(com.test..*)")
target
正如文档所建议,适用于<beanClass> instanceof <targetType>
等于true
的所有bean上的方法调用。