【问题标题】:dynamically create new object with Spring properties injected动态创建注入 Spring 属性的新对象
【发布时间】:2016-04-29 07:06:15
【问题描述】:

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

【问题讨论】:

    标签: java spring properties dependency-injection


    【解决方案1】:

    有一种方法可以将 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。

    【讨论】:

      【解决方案2】:

      您可以使用 AutowireCapableBeanFactory。引用 javadoc:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 2015-01-22
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-30
        相关资源
        最近更新 更多