我们是否需要为 Spring Boot 中的所有内置 类 创建 bean?

Do we need to create bean for all in-built classes in Spring Boot?

我正在尝试使用 Spring Boot 配置 RabbitMQ。下面是我的配置 class.

的快照

案例一:

   @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
        RabbitTemplate template = new RabbitTemplate(connectionFactory);
        template.setMessageConverter(new Jackson2JsonMessageConverter());            
        return template;
    }

这段代码工作正常。

代码 2:

       @Bean
        public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
            RabbitTemplate template = new RabbitTemplate(connectionFactory);
    //      template.setMessageConverter(new Jackson2JsonMessageConverter()); // Line 1 - works
   //       template.setMessageConverter(messageConverter); // Line 2 - error: asks to inject Bean
            return template;
        }

然而,在这种情况下,如果我使用第 1 行,代码可以正常工作,我在其中创建 Jackson2JsonMessageConverter 的对象。

但我编写此代码是为了了解现有代码的工作原理,其中使用的是第 1 行而不是第 2 行。因此,当我使用第 2 行而不是第 1 行时,出现错误:

考虑在您的配置中定义类型为 'org.springframework.amqp.support.converter.MessageConverter' 的 bean。

所以我有两个问题:

  1. 为什么会出现这个错误?
  2. 如果我为 MessageConverter 定义一个 bean,比如

    @豆子 public MessageConverter createMessageConverter() { return 新的 Jackson2JsonMessageConverter(); }

然后就可以了。那为什么它不要求我为 ConnectionFactory 参数定义一个 bean?

PS:这里和我试图理解的代码中都没有使用@Autowired,并且两个参数 ConnectionFactory 和 MessageConverter 都是接口而不是 classes

简短的回答是:你需要了解 Spring Boot 中 AutoConfigurations 的概念,它会为你创建很多 @Beans,没有你 "seeing them"。

一篇很好理解AutoConfigurations的文章是这样的:

https://www.marcobehler.com/guides/spring-boot

对于您的情况,您可能还想查看 Spring Boot 源代码中的 "RabbitAutoConfiguration" class。