2010-01-05 20 views
4

假設我有一顆豆對話框,與高度和寬度屬性:在運行時應用動態屬性到Bean

public class DialogBox { 
int x; 
int y; 
... 
} 

在我的applicationContext.xml我會定義屬性合理的默認值:

<bean id="dialogbox" class="DialogBox"> 
    <property name="x" value="100"/> 
    <property name="y" value="100"/> 
</bean> 

我們有多個使用dialogBox bean的客戶端,每個客戶端都需要x和y的自定義值。一條路線,我們有討論是具有多個屬性文件,一個爲每一個客戶,並讓客戶端ID映射到正確的文件,例如客戶端123將映射到dialogbox_123.properties:當

在運行時
dialogbox_123.properties: 
x=200 
y=400 

然後bean被請求,Spring會查看客戶端是否存在自定義屬性文件,並使用這些屬性,否則使用默認值。我知道PropertyOverrideConfigurer,但AFAIK只有在上下文啓動時才起作用,因此不適用於我們的目的。春天有現成的設施來達到這個目的嗎?或者有人可以推薦另一種方法嗎?

+0

另請參閱http://stackoverflow.com/questions/534030/reloading-refreshing-spring-configuration-file-without-restarting-the-servlet-co – Vadzim 2014-08-29 16:14:22

回答

4
  1. 使用FactoryBean(如已經建議的)來定製實例化。
  2. 在bean上設置scope="prototype",這樣每次需要一個實例時,都應創建一個新實例。
  3. 如果你想在prototype豆注入到一個singleton豆,使用lookup-methodSearch for lookup-method here

我不知道這是否會雖然適合你的情況。另一個建議是:

@PostConstruct您的各種「客戶端」的方法根據需要在已注入的對話框窗口上設置屬性。像:

public class MyDialogClient { 
    @Autowired 
    private Dialog dialog; 

    @PostConstruct 
    public void init() { 
     dialog.setWidth(150); //or read from properties file 
     dialog.setHeight(200); 
    } 
    ... 
} 

再次,在這種情況下,您可以用scope atrribute玩。

0

如果我理解了這個問題,您可以使用FactoryBean來定製Spring中的bean創建邏輯。

+0

感謝您的迴應。我澄清了我們正在努力實現的目標。這是否更有意義? – 2010-01-05 19:33:22

+0

你想說,每個客戶端都有自己的屬性值的dialogBox實例,對吧?您如何確定哪個客戶端請求dialogBox應用自定義值? – axtavt 2010-01-05 20:11:07

+0

當我提到一個客戶端時,我的意思是一個多租戶客戶端,它可以在會話範圍變量中查找 - 因此每個租戶或「客戶端」都可以擁有自己的自定義屬性 – 2010-01-06 22:09:09

2

看看Spring OSGi Compendium services,他們有一個名爲「managed-properties」的屬性管理器,它不僅允許您在運行時更新屬性,而且在應用程序運行時,如果您選擇「管理「更新策略。

相關問題