【发布时间】: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 方法创建切面的实例,在工厂中注入依赖项。这样做的好处是,注入发生在应用程序启动时,而不是第一次拦截发生时。