动态地将属性注入弹簧中

use*_*796 5 java spring dependency-injection

我有一个spring config xml文件,它可以创建多个bean并将其自动装配到其他bean中

例如

<bean id="a" class="com.xyz.A">
        <property name="prop1" value="?" />
   </bean>

   <bean id="b" class="com.xyz.B">
        <property name="prop2" ref="a" />   
   </bean>
Run Code Online (Sandbox Code Playgroud)

我通过阅读上面的spring文件来创建应用程序上下文.但是A的prop1的值在运行时是动态已知的.如何动态注入此属性?动态我的意思是应用程序启动时.例如,一些属性作为命令行输入到应用程序.然后应将此属性设置为bean的属性

我已经给出了这个例子来简化问题.真正的我的动态参数是数据库服务器url,我想动态创建连接池

And*_*fan 4

涉及更多一点,但这是一种方法:

  • 在您的main()方法中,沿着您已经创建的应用程序上下文定义另一个应用程序上下文。这个想法是,您定义一个List存储命令行参数的位置,并args在此应用程序上下文中将此列表定义为一个 bean(带有 id ):
public static void main(String[] args) {
    DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
    BeanDefinition beanDefinition = BeanDefinitionBuilder
            .rootBeanDefinition(Arrays.class, "asList")
            .addConstructorArgValue(args)
            .getBeanDefinition();
    beanFactory.registerBeanDefinition("args", beanDefinition);

    GenericApplicationContext parentContext= new GenericApplicationContext(beanFactory);
    parentContext.refresh();
    ...
}
Run Code Online (Sandbox Code Playgroud)
  • 使用先前定义的应用程序上下文作为方法中已有的应用程序上下文的父级main()。假设您正在创建一个,ClassPathXmlApplicationContext这将是代码:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
            new String[] { "app-context.xml" }, parentContext);
Run Code Online (Sandbox Code Playgroud)

其中parentContext是先前创建的用于保存参数的上下文List

  • 然后,在您的 xml 中,您可以使用 SPeL 轻松访问参数列表:
    <bean id="a" class="com.foo.bar.ClassA">
        <property name="prop1" value="#{args[0]}" />
    </bean>

    <bean id="b" class="com.foo.bar.ClassB">
        <property name="prop2" ref="a" />
    </bean>
Run Code Online (Sandbox Code Playgroud)

请注意,在 xml 中,SPeL 表达式中使用的参数名称是args用于List定义parentContext.