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,我想动态创建连接池
涉及更多一点,但这是一种方法:
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。
<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.
| 归档时间: |
|
| 查看次数: |
9568 次 |
| 最近记录: |