時隔多年又開始寫博客了 最近做項目時發現 一個問題
@Resource
private RocketMQTemplate rocketMQTemplate;
不知道如何自動注入進來了項目裏也沒用@Bean之類 經過探究源碼如下首先引入的包是
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.0.3</version>
</dependency>
類 RocketMQAutoConfiguration
@Bean(
destroyMethod = "destroy"
)
@ConditionalOnBean({DefaultMQProducer.class})
@ConditionalOnMissingBean(
name = {"rocketMQTemplate"}
)
public RocketMQTemplate rocketMQTemplate(DefaultMQProducer mqProducer, ObjectMapper rocketMQMessageObjectMapper) {
RocketMQTemplate rocketMQTemplate = new RocketMQTemplate();
rocketMQTemplate.setProducer(mqProducer);
rocketMQTemplate.setObjectMapper(rocketMQMessageObjectMapper);
return rocketMQTemplate;
}
你看這個類有自動注入用@Bean了 但之前你必須得有
application.properties
rocketmq.producer.group=producer1
一個基本配置 爲什麼 因爲上面代碼
@ConditionalOnBean({DefaultMQProducer.class})他的意思是在注入這個bean之前 必須有DefaultMQProducer這個bean 之後我們在看看
RocketMQAutoConfiguration.class
@Bean
@ConditionalOnMissingBean({DefaultMQProducer.class})
@ConditionalOnProperty(
prefix = "rocketmq",
value = {"name-server", "producer.group"}
)
public DefaultMQProducer defaultMQProducer(RocketMQProperties rocketMQProperties) {
Producer producerConfig = rocketMQProperties.getProducer();
String nameServer = rocketMQProperties.getNameServer();
String groupName = producerConfig.getGroup();
Assert.hasText(nameServer, "[rocketmq.name-server] must not be null");
..............
顯而易見 要想實例化這個bean 必須
@ConditionalOnProperty( prefix = "rocketmq", value = {"name-server", "producer.group"} )得有這個屬性
另外 關於這麼自動注入這個屬性
@Component
@ConfigurationProperties(
prefix = "ceshi"
)
public class Test {
private String nameServer;
private String bb;
private String bbName;
就是這樣 有個小問題 經過試驗
不管是
rocketmq.nameServer=127.0.0.1:9876
還是
rocketmq.name-server=127.0.0.1:9876
還是
rocketmq.nameserver=127.0.0.1:9876
實體類裏 nameServer都可以正常注入