【问题标题】:Dynamic Dependency Injection Spring动态依赖注入 Spring
【发布时间】:2011-06-16 17:22:02
【问题描述】:

我的课堂上有以下代码

public void startListeners() throws Exception {
        List<QueueConfiguration> queueConfigs = queueConfigResolver.getQueueConfigurations();
        for(QueueConfiguration queueConfig : queueConfigs){
            //TODO : work on this make it more testable
            ICustomListener readerListener = new MyCustomListener(queueConfig);
            readerListeners.add(readerListener);
            readerListener.start();
        }

    }

我正在使用 Spring 进行依赖注入(不是在这种情况下,而是总体而言)。现在这段代码有两个问题。

  1. 我无法在测试时为创建的每个侦听器进行模拟。
  2. 我不想使用 ApplicationContext.getBean() 因为它会产生同样的影响。 AFAIK spring 无法动态执行此操作,但还有其他指针吗?

【问题讨论】:

  • 你能更详细地解释一下你到底想测试什么吗? queueConfiguration 还是监听器?为什么你不想完全使用 applicationcontext.getbean? Spring 不能动态地做什么。在这种情况下,动态意味着什么?

标签: spring dynamic dependency-injection


【解决方案1】:

据我所知,您想创建一个新 bean 而不是 ICustomListener readerListener = new MyCustomListener(queueConfig); 如果是这种情况,请为 mycustomlistener 创建一个工厂并使用

public abstract TestClient createTestClient();

创建你的bean,并定义

<bean id="testClient" class="com.myproject.testbeans.TestClient" scope="prototype">     
</bean>
<bean id="testClientFactory" class="com.myproject.testbeans.TestClientFactory">
    <lookup-method name="createTestClient" bean="testClient" />
</bean> 

在您的上下文中将解决您的问题。这样,每次调用工厂的 createTestClient 方法时,都会创建一个新 bean 并将其提供给您的代码。但是,您必须通过 setter 而不是构造函数来提供配置对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2012-12-23
    相关资源
    最近更新 更多