2012-06-07 88 views
3

我有需要的一類春豆運行初始化參數

  1. 依賴注入它採用
  2. 用於初始化運行參數,各種豆類

類將類似於此

東西
public class Validator { 

    @Autowired 
    private ServiceA serviceA; 

    @Autowired 
    private ServiceB serviceB; 

    private String s; 

    private ClassA a; 
    private ClassB b; 

    public void initialize(String s, ClassA a, ClassB b) { 
     this.s = s; 
     this.a = a; 
     this.b = b; 
    } 

    public void performTaskA() { 
     //use serviceA, serviceB, s, a and b 
    } 

    public void performTaskB() { 
     //use serviceA, serviceB, s, a and b 
    } 

    public void performTaskC() { 
     //use serviceA, serviceB, s, a and b 
    } 

} 

什麼是各種選項,通過它我可以def在上面的類中作爲spring bean(爲了利用依賴注入)並且確保調用者在調用任何performTask *()方法之前調用initialize()?

注 - 我知道Object getBean(String name, Object... args) throws BeansException;,但它不好看,因爲我們會失去類型安全。還有其他建議嗎?

更新 - 解決方案提到here與查找方法注射是一個不錯的選擇。在春天實施之前,您對以下使用內部類別的替代方法有何看法:

public class MyService { 
    private ServiceA serviceA; 
    private ServiceB serviceB; 

    public class DataClass { 
     private Integer counter; 

     public DataClass(Integer counter) { 
      this.counter = counter; 
     } 

     public Integer performActionAndGetCount() { 
      serviceB.performAction(); 
      return this.counter++; 
     } 
    } 
} 

//client module 
MyService service = beanFactory.getBean("myService"); 
MyService.DataClass dataClass = service.new DataClass(1); 

這種方法的缺點是什麼?

+0

你可以使用一個工廠bean,或者只是使用初始化,而不是使用構造函數,並在spring xml中爲構造函數提供參數。 –

+0

如何使用運行時的值初始化bean(因爲xml意味着對值進行硬編碼..) –

+2

改變一個singleton bean的狀態可能會導致線程問題,並且不鼓勵,也許你應該更好地解釋你的情況,爲什麼你需要在運行時改變它們。包含狀態被標記爲原型,所以每次被請求時都會被創建。使用工廠bean,您可以將這些值設置爲創建時需要的值。 –

回答

-1

我不太清楚你的要求。但我認爲@PostConstruct註釋的方法可以幫助您解決問題。你可以找到更多關於@PostConstruct註釋的細節here.

希望這可以幫助你。乾杯。

+0

postconstruct/predestroy是當應用程序上下文被加載/銷燬的時候 - 不是單個的豆 – NimChimpsky

+0

是的你是對的我知道這一點。但是,由於我不清楚安迪的要求,我認爲這可能會讓他有辦法達到他想要的。:-) –

0

使用組件,服務或存儲庫註釋來註釋您的類。這將使你的類被視爲一個spring bean,然後你可以使用依賴注入和運行時初始化。

確保在您的{調度員的servlet} .xml(可在{}這個名字你給在web.xml中的分發程序Servlet更換名稱}文件,你寫了這行

+0

Service,Repository和Component註釋會使bean成爲單例bean。我需要一個狀態在運行時傳遞的狀態bean。因此,這個bean需要成爲一個原型bean。有了上述建議,你如何做運行時初始化? –

+0

使用範圍註釋以便指定範圍。 – prashant

+0

使用範圍註釋來指定bean的範圍並將其自動裝入控制器。它將被初始化。如果你指定除了Singleton之外的任何範圍,那麼你將不得不提及範圍如 @Scope(value =「session」,proxyMode = ScopedProxyMode.TARGET_CLASS),因此您需要在類路徑中使用cglib – prashant