2011-12-23 105 views
14

我有一個singleton bean,它有一個創建原型bean實例的方法。我使用方法documented here來獲取原型bean的實例。春天 - 我如何銷燬我的原型範圍的豆子?

public class SingletonService implements ApplicationContextAware { 

    private ApplicationContext applicationContext; 

    public void go() { 

     MyPrototypeBean prototype = applicationContext 
      .getBean(MyPrototypeBean.class); 

     prototype.doSomething(); 
    } 

    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

     this.applicationContext = applicationContext; 
    } 
} 

起初我還以爲這是不夠好,那我的「原型」的情況下會走出去的範圍時,「走出去」的方法返回,這意味着該實例會不引用,並會被垃圾收集。

然而,對從the documentation指出了以下聲明:

客戶端代碼必須清理prototype作用域的對象並釋放 的bean原型(一個或多個)都拿着昂貴的資源。

所以這聽起來像Spring將保留一個參考,所以gc將永遠不會拿起它?如果是這種情況,我該如何告訴Spring發佈該參考?該文檔提到我可以使用「自定義bean後處理器」,但不清楚該處理器適合在哪裏以及它將運行什麼代碼。

感謝所有事先的幫忙, 羅伊

回答

12

我想你誤解了文檔。這只是說Spring不會管理原型bean的生命週期,所以@PreDestroy(等)方法需要由您自己的代碼調用。春天不會保留一個參考。

+0

謝謝藝術 - 所以可以肯定地說上面的代碼是足夠的,並且不會是內存泄漏的原因? – 2011-12-23 17:42:30

+1

好吧,這取決於MyPrototypeBean的實現,但從Spring的角度來看,它很好。 – artbristol 2011-12-23 17:47:54

+0

爲了檢索使用getBean(..)方法的bean。我明白這樣做的性價比很高。那麼你應該如何檢索它? – rayman 2012-07-15 10:04:19