java - 我们需要为 Spring Boot 中的所有内置类创建 bean 吗?

标签 java spring spring-boot rabbitmq spring-rabbit

我正在尝试使用 Spring Boot 配置 RabbitMQ。下面是我的配置类的快照。

案例1:

   @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 对象),则代码可以正常工作。

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

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

所以我有两个问题:

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

    @ bean 公共(public)消息转换器 createMessageConverter() { 返回新的 Jackson2JsonMessageConverter(); }

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

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

最佳答案

简短的回答是:您需要了解 Spring Boot 中 AutoConfiguratrions 的概念,它将为您创建大量 @Bean,而您却“看不到它们”。

了解自动配置的一篇非常好的文章是:

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

就您而言,您可能还想查看 Spring Boot 源代码中的“RabbitAutoConfiguration”类。

关于java - 我们需要为 Spring Boot 中的所有内置类创建 bean 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946864/

相关文章:

java - 如何将两个maven webapp合并到一个项目中

java - 写入文本文件

spring - Spring DataFlow Yarn-容器正在超出物理内存运行

java - 使用 react 堆即发即忘

java - Spring Boot 中使用相同存储库和实体的多个数据源

java - 如何将 Java 存档 (.WAR) 上传到 Plesk 上的 Windows Server?

java - Android 中的自定义进度条首选项问题

java - 每次重新启动应用程序时,使用 CrudRepository 的 Spring boot 数据库(Apache Derby)都会被删除

java - 使用 Spring Security 3.2.x 进行两页登录

maven - Maven下多个spring boot应用的端到端集成测试