2010-07-06 116 views
31

我有多个上下文文件。要求是:一个特定的Bean(它使一些配置更改)在其余的bean中首先被初始化。Spring Bean初始化的顺序

有没有办法让这个bean首先被加载?

一种选择是使用依赖-on`属性。但是这需要更新所有剩下的bean,因此似乎不是最好的解决方案。

我们有更好的选择?

回答

14

恕我直言,你应该等到他们解决https://jira.spring.io/browse/SPR-3948

一个可能的方法是使用取决于-on属性。但是,我不想在所有剩下的bean中添加这个属性(这可能是我的最后一招)。

实际上,您不需要在每个applicationContext.xml中使用依赖关系和每个BEAN。

使用<import />在所有“低lvel” applicationContext.xml中导入最上面的applicationContext.xml。

并且除了最先加载的<bean />之外,在每个bean定义中仅在最高层applicationContext.xml中使用depends-on属性。

+0

是否意味着导入标签的depends-on属性? – 2010-07-09 02:40:43

+0

我的意思是在较低级别的appContext.xml中使用来导入顶级appContext.xml。并且仅在顶级appContext.xml中使用depends-on属性 dira 2010-07-09 05:18:23

+0

init-order不会像依赖关系那么糟糕。有人可以验证负数是否可用于初始订单。如果默认值是1或0? – 2012-03-06 16:13:07

-3

我不是一个春天的专家,可能会被某个人喊出来。但在那之前......

哪里有空间,不确定性,我猜春负载/在它遇到它在配置文件中的顺序应用的东西。因此,作为第一个也是最简单的近似,我会尽量确保您想要首先初始化的东西是配置文件中的第一个东西。

如果这一切都层次,那么你会希望你的“第一次”的配置要么是在“主”文件中的其他人在被调用之前或者如果可能的话在第一调用的文件。

+4

弹簧加载某些类型的豆类(如BeanPostProcessor的)的比别人更早,同时也解决了依赖树。我认为以某种方式尝试“排序”声明是没有用的 - 它完全不起作用,或者在对bean进行任何更改后立即中断。 – 2013-07-10 12:19:44

1

在才有意义,要求豆的顺序,通常对技术豆类(如添加的MBean)业务豆(就像它在http://jira.springframework.org/browse/SPR-3948提议)

使用BeanPostProcessor的是另一种方式,以提供一些前装载在你的豆子订购。检查AbstractApplicationContext.refresh()以查看它是如何实施的。