2016-01-22 95 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。