我是一个相对较新的Spring用户,我有兴趣使用此框架加载复杂的嵌套配置。
以下是我的架构设计的伪代码:
class **A** implements runnable{
int x;
Collection<**B**> clist; //not fixed size list,
run(){
// if (something happens)
// new Thread(**B**(y,z,w))
}
}
class **B** implements runnable{
int y;
int z;
int w;
Array<**C**> bclist; // fixed size array of C known at init time
run(){
process...
}
}
class **C**{
int v;
int l;
}
我需要能够配置A.x,B.y,B.z,B.w,B.clist,C.v和C.l
我有一个与每个新线程的B初始化相关的问题,我不知道在编译时clist是否会保持为空,并且只有在运行时我才会知道将创建多少个线程。对于每个新线程,我使用相同的配置创建新的B.
(我查看了autowire和原型功能,我怀疑它可能有所帮助)
修改
这里有xml示例文件:
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="A" class="...">
<property name="x" value="150" />
<!-- HERE IS MY PROBLEM-->
<property name="clist">
<list>
<ref bean="B" />
</list>
</bean>
<bean id="B" class="...">
<property name="y" value="20" />
<property name="z" value="7" />
<property name="w" value="7" />
<property name="bclist">
<list>
<ref bean="C" />
</list>
</bean>
<bean id="C" class="...">
<property name="v" value="3" />
<property name="l" value="1" />
</bean>
</beans>
答案 0 :(得分:0)
我有一个可能解决这个问题的方法,它可能不是最佳的。
在xml中的A bean中我可以注释掉clist的设置(结构中根本不包括它),
当我在java代码中创建B bean时,我每次都可以使用getBean(“B”),同时将xml中的B bean定义为原型。
像这样:
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="A" class="...">
<property name="x" value="150" />
</bean>
<bean id="B" class="..." scope="prototype">
<property name="y" value="20" />
<property name="z" value="7" />
<property name="w" value="7" />
<property name="bclist">
<list>
<ref bean="C" />
</list>
</bean>
<bean id="C" class="...">
<property name="v" value="3" />
<property name="l" value="1" />
</bean>
</beans>
Java代码:
class **A** implements runnable{
int x;
Collection<**B**> clist; //not fixed size list,
run(){
// if (something happens)
// new Thread((B)context.getBean("B"))
}
}