当前位置: 首页 > 知识库问答 >
问题:

在原型bean中注入依赖项

陈铭晨
2023-03-14

我正在使用Spring3中的查找方法注入将原型bean注入到单例bean中,如这里的Spring文档中所述。在我的原型bean中,我对ApplicationContext.xml中声明的另一个bean有@autowired依赖关系。查找方法注入似乎工作正常,因为我的原型bean被注入到我的单例bean中,然而,原型的依赖项根本没有被注入。当通过查找方法返回原型时,依赖关系是否可以以正常的方式注入到原型bean中?如果不是,首选的方法是什么?

编辑:bean定义如下:

<bean id="jobRouter" class="com.ccn.JobRouter">
   <lookup-method name="createJobConsumer" bean="jobConsumer"/>
</bean>

<bean id="jobConsumer" class="com.ccn.JobConsumer" scope="prototype"/>

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
   <property name="corePoolSize" value="5" />
   <property name="maxPoolSize" value="100" />
   <property name="WaitForTasksToCompleteOnShutdown" value="true" />
</bean>

作业路由器

public abstract class JobRouter {

   private LinkedHashMap<String, JobConsumer> jobRoutingMap = new LinkedHashMap<String, JobConsumer>();

   public void add(Job Job) {
      if(!jobRoutingMap.containsKey(job.getObjectKey())){
             jobRoutingMap.put(job.getObjectKey(), createJobConsumer());
      }
      //Hand off job to consumer
      JobConsumer jobConsumer = jobRoutingMap.get(job.getObjectKey());
      jobConsumer.add(job);
   }

   protected abstract JobConsumer createJobConsumer();
}

JobConsumer

public class JobConsumer {

   @Autowired private TaskExecutor taskExecutor;

   private LinkedBlockingQueue<Job> jobQueue = new LinkedBlockingQueue<Job>();  

   public JobConsumer() {
      taskExecutor.execute(new JobQueueMonitor());
   }

   public boolean add(Job job) {
      if(!jobQueue.contains(job)){
         return jobQueue.add(job);
      }
      return true;
   }

   private class JobQueueMonitor implements Runnable{
      @Override 
      public void run() {
         ...
      }
   }
}

共有1个答案

司徒焕
2023-03-14

我发现我的原型bean中的依赖关系实际上被正确地注入了。问题是,在注入依赖项之前,我试图访问构造函数内部的依赖项(请参见上面代码中的JobConsumer构造函数),而该依赖项显然是空的。我将代码从JobConsumer构造函数移到了@postConstruct注释方法中,结果工作正常。

 类似资料:
  • 我想向Springbean注入一个单例对象依赖关系。问题是我无法访问和修改要注入其对象的类。让我描述一下这个例子。 所以我有我的接口,以及这个接口的实现,如下所示。 然后在我的配置类中,我正在创建一个bean,但是我需要在构造函数中向它传递对象,问题是我不能使成为bean,因为它来自外部包,我不能修改它。 所以我想做的是,能够将/autowire参数传递给bean。目前IntelliJ给我一个错误

  • 我使用和注释来注入一个原型bean。 然而,注入bean的行为类似于单例bean。有没有办法在mockito中注入一个原型范围bean? 我正在使用运行JUnit,并使用运行初始化模拟。

  • 我刚接触Spring,正在尝试理解“将一个原型bean注入一个单例bean”的概念。根据我在singleton中的理解,每个Spring IoC容器只有一个实例,不管您检索它多少次。,因为仍未实例化。我开发了以下示例,其中在单个bean中给出了原型bean的参考,如下所示: RequestProcessor.java requestValidator.java 如何解决?我的理解正确吗? 另一种方

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa

  • 依赖注入 Dependency Injection is a strong mechanism, which helps us easily manage dependencies of our classes. It is very popular pattern in strongly typed languages like C# and Java. 依赖注入是一个很强大的机制,该机制可以帮

  • 简介 Hyperf 默认采用 hyperf/di 作为框架的依赖注入管理容器,尽管从设计上我们允许您更换其它的依赖注入管理容器,但我们强烈不建议您更换该组件。 hyperf/di 是一个强大的用于管理类的依赖关系并完成自动注入的组件,与传统依赖注入容器的区别在于更符合长生命周期的应用使用、提供了 注解及注解注入 的支持、提供了无比强大的 AOP 面向切面编程 能力,这些能力及易用性作为 Hyper