我有一个 spring 配置 xml 文件,它创建多个 bean 并将其中一个 Autowiring 到其他 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>
My 通过读取上面的 spring 文件来创建应用程序上下文。但是 A 的 prop1 的值在运行时是动态已知的。我如何动态地注入(inject)这个属性?动态我的意思是当应用程序启动时。例如,一些属性作为应用程序的命令行输入。 然后应该将此属性设置为 bean 的属性
我给出了这个例子来简化问题。实际上我的动态参数是数据库服务器 url,我想动态创建连接池
最佳答案
有点复杂,但这是一种方法:
- 在你的
main()
方法沿着您已经创建的应用程序上下文定义另一个应用程序上下文。这个想法是你正在定义一个List
将存储命令行参数的位置并将此列表定义为此应用程序上下文中的 bean(ID 为args
):
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();
...
}
- 使用先前定义的应用程序上下文作为您在
main()
中已有的应用程序上下文的父级方法。假设您正在创建一个ClassPathXmlApplicationContext
这将是代码:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "app-context.xml" }, parentContext);
哪里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>
注意在 xml 中,SPeL 表达式中使用的参数名称是 args
这是用于定义 List
的确切名称在parentContext
.
关于java - 动态注入(inject)属性到spring,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25423148/