AspectJ Pointcut不适用于@Component之类的Element.TYPE注释

时间:2019-05-30 10:20:06

标签: java spring aop aspectj

我正在使用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进行注释的Pointcut无法正常工作。我推测这是与批注相关的问题,它们是在AspectJ代理站起来之前先阅读的。

有什么办法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

可能您不是在使用AspectJ,而是在使用Spring AOP。因此,需要考虑以下几点:

  • 通常,Spring AOP方面无论如何都可以在@Component上工作,而不是在非Spring上工作。为此,您确实需要AspectJ。因此,无论如何,您的Spring AOP方面还是会寻找该注释。
  • Spring AOP方面也应为@Component,但会自动从方面编织中排除。在AspectJ中,您需要采取特殊的预防措施,以排除编织与普通应用程序代码具有相同注释的另一个方面。在将Spring AOP与完整的AspectJ结合使用的情况下,您需要考虑这一点。

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

@within(org.springframework.stereotype.Component)

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