2011-03-30 54 views
0

嘗試使用Spring PropertyOverrideConfigurer或一些這樣的子類,以幫助 創建以下豆:春3.X PropertyOverrideConfigurer堅持使用一套,沒有構造器

public class Foo { 
    private final String name; 

    public Foo(String name) { this.name = name; } 

    public String getName() { return name; } 
} 

假設我的bean定義是一樣的東西

<bean id="foo" class="Foo"> 
    <constructor-arg name="name" value="abc"> 
</bean> 

我遞給春天有個文件foo.properties,在那裏找到一個入口 foo.name =「高清」

因此,Foo bean的默認名稱屬性是「abc」,我希望它被overriden爲「def」; 但是我不想讓我的Foo類掛掉一個明確的setName(String name)方法,因爲儘管Spring認爲我認爲這是軟件開發中的一個可怕的 想法。我希望Spring能夠將 覆蓋的值作爲「def」傳遞給Foo的構造函數, 稍後不會使用setName(「def」)調用Foo。

我還沒有得到這個工作,有沒有辦法?我有唯一的成功是 到

public void setName(String name) { this.name = name; } 

添加方法Foo類,而這又我認爲這是一個可怕的想法,因爲它開闢 你的無心之副作用的後級。

有沒有希望?我可以在 之前的某處修改bean的定義嗎?Spring使用(錯誤的)「abc」名稱創建Foo?

+0

[這裏](http://stackoverflow.com/questions/5544525/constructor-injection-with-value-provided-by-another-bean),你可以找到解決方案。這個對我有用。祝你好運。 – 2012-01-27 13:09:19

回答

0

你絕對可以做到。你的XML應該有點像:

<bean id="foo" class="Foo"> 
    <constructor-arg index="0" value="abc"/> 
</bean> 

假設構造函數有一個參數和「ABC」是從你的屬性文件來的值。在這種情況下,制定者不是必需的。

更多信息Spring文檔中提供http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-collaborators

+0

對不起,我打錯了我的bean定義,我已經使用constructor-arg不屬性,將修復我的帖子。 – user1156327 2011-03-30 19:39:01

+0

那你的問題就沒有意義了。如果你定義了constructor-arg參數被傳遞到bean創建的構造函數中 – 2011-03-30 19:54:05

+0

「abc」被傳入,而不是「def」。後來Spring出現並調用setName(「def」),這不是我想要的。我想要用「def」調用構造函數 – user1156327 2011-04-11 15:31:36