java - 动态注入(inject)属性到spring

标签 java spring dependency-injection

我有一个 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/

相关文章:

Java - 从终端运行我的程序并收到以下错误消息(带有/NoClassDefFoundError)

java - 谁调用了一个方法?

java - 无法生成签名的APK?

java - Gradle - 来自单个项目的多个 Jar

java - Spring-远程基本身份验证

java.lang.IllegalStateException : BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

java - 无法初始化类 liquibase.sqlgenerator.core.LockDatabaseChangeLogGenerator

asp.net-mvc - ASP.NET MVC Web API 和 StructureMap : "does not have a default constructor"

asp.net - 奇怪的错误 : [ArgumentOutOfRangeException: 'count' must be non-negative

asp.net-mvc - 使用 Ninject 和 MVC 对服务层的依赖