【问题标题】:AspectJ Pointcut doesn't work on Annotations with Element.TYPE like @ComponentAspectJ 切入点不适用于带有 Element.TYPE 的注释,例如 @Component
【发布时间】:2019-10-15 23:52:33
【问题描述】:

我正在使用 AspectJ,并尝试在 @Component 注释上切入点。

@Pointcut("@annotation(org.springframework.stereotype.Component)")
   public void bean() {
}

@Before("bean()")
public void beforeBeanCreation(JoinPoint jp) {
    System.out.println("Works!");
}

我的配置如下:

@Configuration
@ComponentScan({"com.app.pl"})
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED)
public class AppConfiguration{

}

当我想在带有 ElementType.METHOD 的注释或具有特定名称的 bean 上切入点时,一切正常。但是使用 ElementType.TYPE 注释的切入点不起作用。我推测这是一个与注释相关的问题,它们是在 AspectJ 代理站起来之前阅读的。

知道如何解决这个问题吗?

【问题讨论】:

    标签: java spring aop aspectj spring-aop


    【解决方案1】:

    可能您使用的不是 AspectJ,而是 Spring AOP。所以有几点需要考虑:

    • 通常 Spring AOP 方面无论如何都适用于@Components,而不适用于非 Spring 的东西。为此,您真的需要 AspectJ。所以在某种程度上,你的 Spring AOP 方面无论如何都会寻找那个注解。
    • Spring AOP切面也应该是@Components,但是自动排除切面编织。在 AspectJ 中,您将需要特殊的预防措施来排除一个方面编织另一个具有与正常应用程序代码相同的注释的方面。在将 Spring AOP 与完整的 AspectJ 结合使用的情况下,您需要考虑这一点。

    现在关于您的 AOP 问题,您无法通过 @annotation() 切入点拦截带注释的类中的连接点,正如您已经注意到的那样。您需要改用@within(),例如:

    @within(org.springframework.stereotype.Component)
    

    请注意,这将拦截带注释的类中的所有连接点,即在 Spring AOP 的情况下所有方法执行。如果您的日志消息表明这是您的目标,它不会拦截 bean 创建。

    【讨论】:

    • 这两个配置@EnableAspectJAutoProxy(proxyTargetClass = true) @EnableLoadTimeWeaving(aspectjWeaving = AspectJWeaving.ENABLED) 应该启用我AspectJ。我检查了豆子是用 CBLIB 编织的,所以它是 AspectJ。您有权在每个方法调用上调用 @within 方法并且它有效。另一方面,当我想在ContextRefreshedEvent 之后捕获 bean 时,带有 CGLIB 的代理 bean 无法正常工作。我想为它们添加相关的 Serenity 字段(net.serenitybdd.core.Serenity.initialize(bean))。这可能是我以后要处理的其他 bean。
    • 注意:@EnableAspectJAutoProxy 用于 Spring AOP,@EnableLoadTimeWeaving 用于 AspectJ。如果您只想使用一种 AOP 工具,您不想同时激活两者。所以请再次删除@EnableLoadTimeWeaving,否则你的方面可能会被两个不同的工具编织两次。请通过阅读 Spring 手册了解两者之间的区别。至于你的新问题,不看你的代码我是无法理解的。也许您想在新问题中发布MCVE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2013-02-12
    • 1970-01-01
    相关资源
    最近更新 更多