java - AspectJ 切入点不适用于带有 Element.TYPE 的注释,例如 @Component

标签 java spring aop aspectj spring-aop

我正在使用 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 代理站起来之前就被读取了。

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

最佳答案

可能您使用的不是 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 创建,如果您的日志消息表明这是您的目标。

关于java - AspectJ 切入点不适用于带有 Element.TYPE 的注释,例如 @Component,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56376303/

相关文章:

java - Spring boot 将 JSON 反序列化为多态类型

java - Spring - 如何从 Web 应用程序停止和启动 Web 服务?

java - 当使用注释声明 bean 时,JMX MBean 不会显示在 JConsole 上

java - 在非单例 bean 上的 Spring 代理上修复 BeanNotOfRequiredTypeException?

java - Spring请求范围bean代理bean无法注入(inject)

java - Spark 2.0.0 抛出 AlreadyExistsException(消息 :Database default already exists) when interact with Hive 1. 0.0

java - 如果调用通用静态方法,编译器如何使用通用信息?

java - 注释字段x时,在构建时将注释添加到Java getter getX()

java - 用Java模拟链表

java - Spring-远程基本身份验证