【问题标题】:How @Aspect with @Component annotation works under the hood带有 @Component 注释的 @Aspect 如何在幕后工作
【发布时间】:2017-04-12 23:44:13
【问题描述】:

我一直在寻找答案,但到目前为止没有运气,因此我来这里是为了一些智慧的话。

我使用@Aspect 注解创建了一个切面,因为我需要@Autowire 一些单例依赖项 我决定用@Component 对这个切面类进行注解并让Spring 来发挥作用。但是,它可以工作...

我对 AOP 概念、编织内容和它的不同风格(cglib 与 aspectj)相当熟悉,但我并不完全直观地了解它是如何工作的。

@Component 表示给定类在给定上下文中是单例,@Aspect 表示方面类的内容将在运行时/编译期间以某种方式编织到目标类中 - 这个目标类不是单例,而是以原型为例。那么我最后的结局是什么?

【问题讨论】:

  • 我已经使用 AspectJ weaver 对需要自动装配依赖的方面进行了一些测试。我发现用@Component注解切面不起作用,因为我们最终得到了切面的两个实例,一个是在组件注解之后创建的bean,另一个是由编织方法ajc$postClinit创建的,它是在拦截中使用的实例。我设法使用@Configurable@EnableSpringConfigured 使其工作。
  • 另一种选择是创建一个FactoryBean,它使用切面类的 aspectOf 方法创建切面的实例,在工厂中注入依赖项。这样做的好处是,注入发生在应用程序启动时,而不是第一次拦截发生时。

标签: spring aop aspectj


【解决方案1】:

Spring AOP 不进行编译时编织,也不修改建议目标的代码。相反,它适用于围绕连接点编织的代理。这就是为什么 Spring AOP 方面并被用作(单例)组件,使其字段自动装配等,就像任何其他 Spring 代理一样。

这也是为什么 Spring AOP 方面只适用于公共方法执行,而不适用于字段访问等的原因。

文档写得非常好,并且尽可能多(或尽可能少)详细说明: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

【讨论】:

    【解决方案2】:

    AspectJ in Action 的第 2.5 节是关于编织步骤的内部工作的,它只有 2 页,但很好地传达了要点。

    幸运的是,该部分可用here

    这是为了后代。

    【讨论】:

    • 请从链接中添加一些内容。
    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多