【问题标题】:spring bean skip auto wire for collection declared inside componentspring bean 跳过自动线,用于在组件内声明的集合
【发布时间】:2019-03-20 18:58:16
【问题描述】:

下面是我的代码,因为阻塞队列没有这样的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();
    }

}

【问题讨论】:

  • 您可以在构造函数上添加autowire注解并设置required=false。尽管我会删除当前的构造函数以支持自动装配的设置器。通常构造函数用于必需的依赖项,setter 可选,应避免字段自动装配。

标签: java spring


【解决方案1】:

这就是 Spring 的工作原理。如果你的类只有一个构造函数,那么 Spring 会尝试使用它来创建你的 bean。在这种情况下,它会尝试在自动装配的上下文中找到它的所有参数。显然没有在上下文或配置类中声明BlockingQueue&lt;String&gt; 类型的bean。

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

public Task(GenericServiceImpl genericServiceImpl, BlockingQueue<String> queue) {
    //.....
}

并且还使 Task 类成为简单的类,没有任何 Spring 注释。 在这种情况下,您将需要像这样手动创建此类的实例

@Service
class AnotherService {

    private Task task;

    public AnotherService(GenericServiceImpl genericServiceImpl) [
        BlockingQueue<String> queue = ....;
        task = new Task(genericServiceImpl, queue);
    }
}    

【讨论】:

  • 谢谢,到目前为止我只这样做过,我觉得这样做的方法不正确,我也尝试过使用无参数构造函数,但它没有用。公共任务() { this.queue = null; }
【解决方案2】:

因为除了Task(BlockingQueue&lt;String&gt; queue) 之外,Spring 没有任何public constructor 可以instantiate Task 对象。因此,当 spring 尝试 instantiate Task 对象时,它将尝试查找 BlockingQueue 的 bean,因为它需要传递(唯一的公共构造函数)。你可以通过添加一个空的constructor来解决问题

public Task() { } 

或提供BlockingQueue的绑定

我不确定您为什么使用 BlockingQueue,因为根据您发布的代码,我找不到它的任何用途。

【讨论】:

  • 谢谢,我尝试了无参数构造函数它不起作用我在帖子本身中提到,阻塞队列我正在使用它,它是不必要的代码发布,描述一个问题我认为这已经足够了.
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
相关资源
最近更新 更多