2016-07-23 93 views
0

在Spring中使用no參數構造函數時,是否可以確保在初始化bean之前設置了一些屬性?我想在創建bean之後使用InitializingBean來驗證設置。例如,我想要做什麼:Spring在使用無參數構造函數時確保已設置Bean屬性

public class HelloWorld implements InitializingBean{ 
    private String message; 

    public HelloWorld() 
    { 
     //Only no-args constructor must be used 
     //How do we make sure 'message' was ever set before the Bean is used? 
    } 

    public void setMessage(String message){ 
     this.message = message; 
    } 

    public void getMessage(){ 
     System.out.println("Your Message : " + message); 
    } 

    public void afterPropertiesSet(){ 
     //Validate object, requires message to be set! 
    } 
} 

public class MainApp { 
    public static void main(String[] args) { 

     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); 

     //Bean is instantiated 
     HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); 
     //Bean is initialized and thus afterPropertiesSet() is called here. It will fail because it requires 'message' to be set. 

     //Right after the bean is instantiated we set the 'message', but it's already to late. afterPropertiesSet() was already called. 
     obj.setMessage("Hello World!"); 

    } 
} 
+0

我不明白。你有'afterPropertiesSet',只是拋出一個異常或其他指標,它沒有被正確初始化。 –

+0

可以將消息注入到該類中,因爲如果沒有注入它的依賴項(至少默認情況下),則無法創建該bean。基本上,容器將爲您完成整件事。 – mszymborski

+0

@SotiriosDelimanolis那麼你會如何建議在給定的MainApp示例中創建Bean?在創建bean之前,我無法使用context.getBean調用obj.setMessage,該bean在創建bean的過程中執行afterPropertiesSet()。例外情況總是會發生。在給出的例子中,我沒有看到如何正確初始化bean。 – masi

回答

0

要注入在運行時確定的東西,請考慮使用FactoryBean。它基本上是工廠模式,而是由春原生支持:

public class SomeWeirdMessageFactoryBean implements AbstractFactoryBean { 
     public Class<?> getObjectType() { 
      return String.class; 
     } 

     protected Object createInstance() throws Exception { 
      String message; 
      // magic: 
      [...] 
      return message; 
     } 
    } 

magic部分顯然是什麼必須弄清楚什麼返回。然後你必須注入它作爲你班級的財產,而Spring將會發現它是一家工廠,並且爲你做了骯髒的工作。

+0

謝謝你的重播,但我不明白這將如何幫助。 createInstance()方法沒有使用任何參數,在howtodoinjava.com的例子中,你發佈了很清楚,這些屬性仍然使用預先配置的xml文件注入。工廠將採用一系列的bean配置並構建多個bean。目前還不清楚如何動態地提供配置,以便在bean初始化之前在運行時設置屬性。我想我在這裏採取錯誤的方式,並會嘗試重新考慮設計本身。 – masi

+0

@masi:你能否提供你正在尋找的用例? createInstance可以使用任何想要獲取當前配置的方法 - 從數據庫,網絡,您提供的緩存中獲取數據。當然,如果你不想對它進行硬編碼,你也必須在工廠的構造函數中將它們作爲bean來提供,並在稍後對它們進行初始化 - 關鍵是參數是在你請求bean的那一刻計算出來的'原型'或懶惰'單身'範圍) – mszymborski

相關問題