我们是否需要为 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。
所以我有两个问题:
- 为什么会出现这个错误?
如果我为 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。
我正在尝试使用 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。
所以我有两个问题:
- 为什么会出现这个错误?
如果我为 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。