27

无论如何指定要实例化bean的顺序吗?即,我希望在其他 bean 之前实例化特定的 bean,就像启动序列一样。

我正在使用 Spring 3.2 和基于注释的声明方法。

4

4 回答 4

56

如果 bean A通过定义bean B依赖于 bean B<property/>@Autowired<constructor-arg/>顺序由 Sp​​ring 容器强制和固定。这里没问题。

但是,如果您想强制执行未通过显式依赖项表达的特定 bean 创建顺序,请随意使用:

<bean id="A" depends-on="B"/>
<bean id="B"/>

或更好(带有注释,也适用于@BeanJava 配置):

@Service
@DependsOn("B")
public class A {}

甚至更好......不要使用它。这些构造是一种代码味道,通常表明您的组件之间存在一些令人讨厌的无形依赖关系。

于 2012-12-07T20:29:06.543 回答
7

同意 Tomasz 提供的答案。如果您知道 bean A 依赖于 bean B,那么这是正确的方法。

有时,您有应该在所有 bean 实例化之前执行的逻辑。在这种情况下,您可以使用BeanFactoryPostProcessor。Spring 首先创建并执行 BeanFactoryPostProcessors,然后只创建和执行所有其他 bean。同时,如果您的 BeanFactoryPostProcessor 依赖于某个 bean A,您可以使用属性或构造函数注入。在这种情况下,Spring 将首先创建 bean A,然后是您的 BeanFactoryPostProcessor,调用 BeanFactoryPostProcessor,然后仅实例化上下文中的所有其他 bean。

于 2013-11-23T14:00:53.473 回答
3

您可以使用 bean 上的 Ordered 接口来定义相对于其他 bean 的排序。

于 2012-12-07T20:16:09.770 回答
0

此外,如果你BeanFactoryPostProcessor像 emamedov 所说的那样使用,Ordered可以实现接口来控制BeanFactoryPostProcessor实例顺序。

于 2018-10-19T03:11:28.693 回答