我在“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“部分杀死了希望的模块性
或者,这是实现这种模块化的更纯粹方式吗?
答案 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。