2016-01-22 114 views
0

我想在動態創建Foo對象,但我希望Foo的某個字段由Spring的xml文件定義的屬性值填充。動態創建注入彈簧屬性的新對象

舉例來說,我有以下的Foo類:

public class Foo { 
    @Value("${val1}") 
    private String val1; 

    private String val2 

    public foo(String val2) { 
     this.val2 = val2; 
    } 

    public String getVal1(){ 
     return val1; 
    } 

    public void setVal1(String val1) { 
     this.val1 = val1; 
    } 
} 

現在,我知道,因爲我的Foo對象沒有被定義爲在我的XML文件的bean @Value會爲空。但是,我不想把它定義爲一個bean作爲我需要定義VAL2動態,像這樣:

Foo foo = new Foo("val2"); 

是否有辦法注入VAL1到所創建的Foo的每個實例?我知道new運算符超出了Spring的範圍,因此無法注入值,但我主要是想找到任何方法來在Foo的新實例中動態指定val2,同時還會向Spring注入val1。

回答

0

您可以使用AutowireCapableBeanFactory。從javadoc的報價:對於其他框架

集成代碼可以利用此接口 線和填充現有的bean實例,Spring不是控制 的的生命週期。

0

有一種方法可以將val1注入到創建的每個新實例Foo中。 val1的值可以通過spring context直接注入。

這裏就是我的意思

public class Foo { 

private String val1; 

private String val2 

public foo(AbstractApplicationContext springContext, String val2) { 
    this.val2 = val2; 
    this.val1 = springContext.getEnvironment().getProperty("val1"); 
} 

public String getVal1(){ 
    return val1; 
} 

public void setVal1(String val1) { 
    this.val1 = val1; 
} 
} 

我們在上面所做的是通過構造函數傳遞上下文,以獲得屬性值。

這不需要按照上面指定的確切方式來實現。我們只需要確保Foo可以訪問ApplicationContext或Environment。只要foo可以訪問ApplicationContext或Environment,我們總是可以將屬性值拉出來並用它來構造Foo。