当bean被声明为内部bean时,它应该在销毁外部bean时被销毁。但是在下面没有调用bean的destroy方法的情况下不会发生这种情况。
innerbeans-spring.xml
<bean id="car" name="carBean" class="com.semanticbits.shoaib.innerbeans.Car" destroy-method="destroy" init-method="init">
<property name="engine">
<bean class="com.semanticbits.shoaib.innerbeans.Engine" destroy-method="destroy" init-method="init">
</bean>
</property>
</bean>
Car.java :只需要在此处写的代码
public void init(){
System.out.println("Car init method");
}
public void destroy(){
System.out.println("Car destroy method");
}
public static void main(String[] args){
ConfigurableApplicationContext context=(ConfigurableApplicationContext)ApplicationContextFactory.getApplicationContext("innerbeans-spring.xml");
Car car=context.getBean("car",Car.class);
context.getBeanFactory().destroyBean("car",car);
}
Engine.java :只需要在此处写的代码
public void init(){
System.out.println("Engine init method");
}
public void destroy(){
System.out.println("Engine destroy method");
}
输出:
Engine init method
Car init method
Car destroy method
我的问题是:
1)getBeanFactory().destroyBean(String beanName,Object beanReference)
beanName在这里意味着什么?
2)为什么没有调用Engine类的destroy
方法,因为Engine是内部bean到Car类?
扩展问题:
public static void main(String[] args){
ConfigurableApplicationContext context=(ConfigurableApplicationContext)ApplicationContextFactory.getApplicationContext("innerbeans-spring.xml");
Car car=context.getBean("car",Car.class);
context.getBeanFactory().destroyBean("car",car);
//now here Car bean is destroy.
//when I call then check the output section.
context.getBeanFactory().destroySingletons();
}
扩展输出:
Engine init method
Car init method
Car destroy method
Car destroy method
Engine destroyed.
3)当Car实例已被销毁时,为什么Car的destroy()方法再次被调用?
先谢谢。
答案 0 :(得分:0)
如果我没弄错的话,我相信只有当BeanFactory关闭时引擎才会被销毁。
你也可以通过调用Engine的destroy方法直接让Car处理它:
<强> Car.java:强>
public void destroy(){
engine.destroy();
System.out.println("Car destroy method");
}
答案 1 :(得分:0)
您有bean
engine
声明
<bean class="com.semanticbits.shoaib.innerbeans.Engine" destroy-method="destroy" init-method="init">
</bean>
这意味着Spring引用了这个bean定义及其创建的实例(它注入了它)。当您决定关闭/关闭ApplicationContext
时,Spring会遍历每个bean,如果需要,还会调用destroy-method
。
car
bean。 engine
bean的生命周期与car
bean无关。 engine
bean是ApplicationContext
的一部分,即使它是在另一个bean
定义中定义的。