RocketMQTemplate是如何自動注入到bean容器的

時隔多年又開始寫博客了 最近做項目時發現 一個問題

 @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都可以正常注入

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章