无论如何要指定实例化bean的顺序吗?即我希望在其他bean之前实例化特定bean,就像启动序列一样。
我正在使用Spring 3.2和基于注释的声明方法。
答案 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
实例序列。