尽可能晚地初始化Spring Bean

时间:2014-02-10 11:08:20

标签: java xml spring

我在“super-context.xml”中有一个完整的情况:

<bean id="conf" class="ee.Conf"/>

<bean id="service" class="ee.Serivce">
  <property name="conf" ref="conf">
</bean>

现在我想在各种不同的项目中使用这个“super-context.xml”。说“sub-context.xml”有:

<import resource="super-context.xml"/>

<bean id="subConf1" class="ee.SubConf">
   <property name="confloc" value="classpath:ee/customconf1.sss" />
</bean>

<bean id="subConf2" class="ee.SubConf">
   <property name="confloc" value="classpath:ee/customconf2.sss" />
</bean>

...

<bean id="subConfn" class="ee.SubConf">
   <property name="confloc" value="classpath:ee/customconfn.sss" />
</bean>

ee.Conf如下:

public class Conf ... {
    ...
    public void addSubConf(Resource res) {
       //configuration resolving from res
    }
    ...
} 

ee.SubConf如下:

public class SubConf ... {
    ...
    @Autowired
    ee.Conf superConf;
    ...
    public void setConfloc(Resource res) {
       superConf.addSubConf(res);
    }
    ...
}

问题在于上下文加载。 Bean按以下顺序初始化(由于在上下文文件中排序):conf,service,subConf1,subConf2,... subConfn

但是服务bean实际上依赖于所有的subConf bean(尽管这不能从上下文定义本身中扣除)。在subConf bean定义之后添加“sub-context.xml”中的导入时,它加载OK。

这背后的原因是实现模块化。是否可以尽可能晚地强制加载bean(示例中为“service”bean)或尽快使某些类型的bean加载(示例中为“subConf”bean),因为“ sub-context.xml“部分杀死了希望的模块性

或者,这是实现这种模块化的更纯粹方式吗?

2 个答案:

答案 0 :(得分:1)

您可以使用depends-on

<bean id="beanOne" class="foo.Bar" depends-on="beanTwo" />

答案 1 :(得分:1)

我会说你正在以错误的方式解决问题。 SubConf不应该依赖Conf开头。只需在SubConf对象中注入Conf个对象的集合。

public class Conf {

    @Autowired
    private List<SubConf> subconfs;
}

这样你就不需要SubConf来调用Conf类,这将删除你的循环依赖。

有关自动装配的详细信息,请参阅Spring reference guide