Spring Aspects/Advisors 的初始化顺序
Posted
技术标签:
【中文标题】Spring Aspects/Advisors 的初始化顺序【英文标题】:Initialization Order of Spring Aspects / Advisors 【发布时间】:2014-02-07 15:15:54 【问题描述】:有没有办法配置 Spring 中不同的 Aspects(或者更准确地说是它们对应的 Advisor)的初始化方式?请注意,我说的不是通知顺序,而是方面的初始化。
这个问题的背景是Aspect A
依赖于Service X
的用例,应该由Aspect B
告知。但是,由于Aspect A
首先被初始化并强制创建Service X
,所以Aspect B
不会应用于服务。
如何在不使Service X
依赖于Aspect B
的情况下更改初始化顺序(这将是一种解决方法,因为它会强制执行所需的顺序,但服务永远不必处理它的各个方面...)?
如果你想了解我的问题,here is another question which led me to asking this one.
【问题讨论】:
【参考方案1】:切面通常只是一个带有@Aspect
注释的类,它也被@Component
注释或具有相应的<bean>
定义。换句话说,它只是一个豆子。
定义 bean 初始化顺序的唯一方法是使用 depends-on
属性(或 @DependsOn
)或使用导入上下文的顺序。
【讨论】:
好的,所以如果我的Aspect B
是通过@EnableCaching
自动创建的缓存并且我没有明确地放在一起,那么没有办法以更抽象的方式等待它的创建,而不是依赖于BeanFactoryCacheOperationSourceAdvisor
(这是缓存方面的最后一个相关 bean),对吧?因此,如果将来 spring 缓存的默认 bean 发生变化,它将不再起作用......
@chk 我认为你能做的最好的就是把它放在一个由另一个导入的 @Configuration
类中。
嗯,不幸的是,这并没有真正帮助。它会影响在不同配置中显式定义的 Bean 的初始化顺序,但这似乎不适用于 @EnableCaching
隐式声明的 Bean...以上是关于Spring Aspects/Advisors 的初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章
你了解Spring从Spring3到Spring5的变迁吗?
学习笔记——Spring简介;Spring搭建步骤;Spring的特性;Spring中getBean三种方式;Spring中的标签