Spring 3 豆实例化序列

2022-09-01 15:08:41

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

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


答案 1

如果 Bean A 通过定义依赖于 Bean B,或者顺序是由 Spring 容器强制和固定的。这里没问题。<property/>@Autowired<constructor-arg/>

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

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

或更好(使用注释,也适用于Java配置):@Bean

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

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


答案 2

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

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


推荐