注入Spring属性动态创建新对象

时间:2016-01-22 15:58:04

标签: java spring properties dependency-injection

我想动态创建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;
    }
}

现在,我知道@Value将为null,因为我的Foo对象未在我的XML文件中定义为bean。但是,我不想将它定义为bean,因为我需要动态定义val2,如下所示:

Foo foo = new Foo("val2");

有没有办法将val1注入到创建的每个Foo实例中?我知道new运算符超出了Spring的范围,因此无法注入值,但我主要是寻找在Foo的新实例中动态指定val2同时还使用Spring注入val1的任何方法。

2 个答案:

答案 0 :(得分:0)

您可以使用AutowireCapableBeanFactory。引自javadoc:

  

其他框架的集成代码可以利用此接口   连接并填充Spring无法控制的现有bean实例   的生命周期。

答案 1 :(得分:0)

有一种方法可以将val1注入到每个新创建的Foo实例中。 val1的值可以直接通过spring上下文注入。

这就是我的意思

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。