在Spring AOP中与目标切入点指示符之内

问题描述 投票:0回答:1

我无法理解内部切入点指示符与目标切入点指示符之间的区别。

看例子:

@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而不是内部时,输出为:建议之前...快点!经过咨询...

java spring-aop
1个回答
0
投票

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.*)")

或带有子包选择器的某些父包

@Pointcut("within(com.test..*)")

target

-限制匹配连接点(使用Spring AOP时方法的执行),其中目标对象(代理的应用程序对象)是给定类型的实例]]

正如文档所建议,适用于<beanClass> instanceof <targetType>等于true的所有bean上的方法调用。

© www.soinside.com 2019 - 2024. All rights reserved.