Spring目标指示符

时间:2017-10-01 20:52:08

标签: java spring-aop

我无法理解内部和目标切入点指示符之间的区别。 看一下这个例子:

@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! 建议后......

1 个答案:

答案 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的方法调用。