内豆在春天如何被摧毁?

时间:2014-02-03 12:36:41

标签: java spring inversion-of-control

当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()方法再次被调用?

先谢谢。

2 个答案:

答案 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定义中定义的。