Spring 3 bean实例化序列

时间:2012-12-07 20:04:01

标签: java spring

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

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

4 个答案:

答案 0 :(得分:56)

如果bean A 依赖于bean B ,可以通过定义<property/>@Autowired<constructor-arg/>来强制并修复订单由Spring容器。这里没问题。

但是如果你想强制执行特定的bean创建顺序,而不是通过显式依赖表示,可以随意使用:

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

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

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

甚至更好......不要使用它。这些结构是一种代码气味,通常表明你的组件之间存在一些令人讨厌的隐形依赖。

答案 1 :(得分:7)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

此外,如果您如emamedov所述使用BeanFactoryPostProcessor,则可以实现Ordered接口来控制BeanFactoryPostProcessor实例序列。