Java 使用弹簧特性动态创建新对象

Java 使用弹簧特性动态创建新对象,java,spring,properties,dependency-injection,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(){

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

您可以使用AutowireCapableBeanFactory。引自javadoc:

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


有一种方法可以将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或环境。只要foo可以访问ApplicationContext或环境,我们就可以随时提取属性值并使用它来构造foo