在组件内部声明的Spring bean跳过自动收集电线

时间:2019-03-20 18:58:17

标签: java spring

以下是我的代码,由于阻塞队列,不会出现此类bean异常。 NoSuchBeanDefinitionException:没有类型为'java.util.concurrent.BlockingQueue的合格Bean。如何忽略队列的自动布线?我需要通过自动装配使用genericServiceImpl类。我添加了较少的参数构造函数,并检查了它是否起作用。

@Component
public class Task {

    @Autowired
    private GenericServiceImpl genericServiceImpl;

    private BlockingQueue<String> queue = null;

    public Task(BlockingQueue<String> queue) {
    this.queue = queue;
  }

    private void task() {
      genericServiceImpl.findAll();
    }

}

2 个答案:

答案 0 :(得分:0)

因为您没有public constructor以外的其他instantiate可以使Spring Task Task(BlockingQueue<String> queue)对象。因此,当spring尝试instantiate Task对象时,它将尝试根据需要传递BlockingQueue的bean(唯一的公共构造函数)。您可以通过添加一个空的constructor

来解决该问题。
public Task() { } 

或提供BlockingQueue

的绑定

我不确定您为什么使用BlockingQueue,因为根据您发布的代码,我找不到该用法。

答案 1 :(得分:0)

这就是Spring的工作方式。如果您的类只有一个构造函数,那么Spring会尝试使用它来创建您的bean。并且在这种情况下,它尝试在上下文中查找其所有参数以自动装配。显然,在上下文或配置类中没有声明类型deps = !func: mock pytest==3.9.3 pytest-cov pytest-sugar func: behave 的bean。

如果您真的需要将该队列作为参数传递,我最好让您的类在构造函数中接受两个参数

BlockingQueue<String>

,还可以使public Task(GenericServiceImpl genericServiceImpl, BlockingQueue<String> queue) { //..... } 类成为没有任何Spring注释的简单类。 在这种情况下,您将需要像这样手动创建此类的实例

Task