我有两个问题......
1)我有一个查询,当spring容器是intialiazed时,在spring容器本身初始化bean,并且在调用get bean()方法之前,这是默认行为,我该如何配置应用程序以这种方式,只有在调用getbean()时才应该在容器中初始化bean,我们应该将bean声明为原型来实现这一点。
2)第二个问题是首先请先通过以下示例...
<beans>
<bean id="triangle" class="Demo.Triangle" scope="singleton" >
<property name="pointA" ref="zeropoint"/>
<property name="pointB" ref="firstpoint"/>
<property name="pointC" ref="secondpoint"/>
</bean>
<bean id="zeropoint" class="Demo.Point" scope="prototype" >
<property name="x" value="10" />
<property name="y" value="20" />
</bean>
<bean id="firstpoint" class="Demo.Point" scope="prototype" >
<property name="x" value="10" />
<property name="y" value="20" />
</bean>
<bean id="secondpoint" class="Demo.Point" scope="prototype">
<property name="x" value="10" />
<property name="y" value="20" />
</bean>
如上所示,三角形bean是单例,它引用bean是protoype现在当我访问singleton时其他引用bean zeropoint,firstpoint和secondpoint也只相对于三角形初始化一次但是这里我希望每次都是新的实例获取三角形bean时要创建这三个bean,请告知如何实现。是通过我的pojo实现ApplicationContextAware接口可以实现的,请指教
答案 0 :(得分:3)
我建议尝试查找方法功能,而不是依赖Spring基础架构(BeanFactoryAware
):
abstract class Triangle {
public abstract Point createZeroPoint();
public abstract Point createFirstPoint();
public abstract Point createSecondPoint();
public void foo() {
Point p0 = createZeroPoint();
Point p1 = createFirstPoint();
Point p2 = createSecondPoint();
}
}
每次调用create*Point()
抽象方法时,它都会创建Point
的新实例。但是如何实现此方法以及它如何知道返回哪个bean? Spring为您实现了这一点!
<bean id="triangle" class="Demo.Triangle" scope="singleton">
<lookup-method name="createZeroPoint" bean="zeropoint"/>
<lookup-method name="createFirstPoint" bean="firstpoint"/>
<lookup-method name="createSecondPoint" bean="secondpoint"/>
</bean>
查看综合文档:4.4.6.1 Lookup method injection。
答案 1 :(得分:2)
<bean id="myBean" class="a.b.MyBean" lazy-init="true"/>
firstpoint
和secondpoint
bean没有有效的范围定义(您错过了scope=
)zeropoint
相关,则每个三角形都会有一个单独的zeropoint
实例。E.g。
class MyClass implements BeanFactoryAware {
private BeanFactory beanFactory;
public void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory;
}
public void doSomethingThatRequiresNewInstance() {
Triangle t = beanFactory.getBean("zeropoint", Triangle.class);
// because zeropoint is defined as prototype you get a new instance everytime you call getBean(..)
}
}