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中的标签

Spring全家桶笔记:Spring+Spring Boot+Spring Cloud+Spring MVC

Spring--Spring入门

Spring:Spring介绍

Spring浅析Spring框架的搭建