日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
徒手?jǐn)]了一個(gè)Starter,同事直夸我666~

[[396095]]

Spring Boot starter原理

Spring Boot 將常見(jiàn)的開(kāi)發(fā)功能,分成了一個(gè)個(gè)的starter,這樣我們開(kāi)發(fā)功能的時(shí)候只需要引入對(duì)應(yīng)的starter,而不需要去引入一堆依賴(lài)了!starter可以理解為一個(gè)依賴(lài)組,其主要功能就是完成引入依賴(lài)和初始化配置。Spring 官方提供的starter 命名規(guī)范為 spring-boot-starter-xxx ,第三方提供的starter命名規(guī)范為 xxx-spring-boot-starter 。

這里我們以 RocketMQ 的依賴(lài) rocketmq-spring-boot-starter 來(lái)學(xué)習(xí) starter的原理。

在項(xiàng)目中引入 rocketmq-spring-boot-starter 之后,實(shí)際上就引入了 rocketmq 的一些相關(guān)依賴(lài)。

在 rocketmq-spring-boot 中有一個(gè)自動(dòng)裝配的類(lèi)RocketMQAutoConfiguration ,我截取了其中的一小段代碼,一起來(lái)看看。

 
 
 
 
  1. @Configuration 
  2. @EnableConfigurationProperties(RocketMQProperties.class) 
  3. @ConditionalOnClass({MQAdmin.class}) 
  4. @ConditionalOnProperty(prefix = "rocketmq", value = "name-server", matchIfMissing = true) 
  5. @Import({MessageConverterConfiguration.class, ListenerContainerConfiguration.class, ExtProducerResetConfiguration.class, RocketMQTransactionConfiguration.class}) 
  6. @AutoConfigureAfter({MessageConverterConfiguration.class}) 
  7. @AutoConfigureBefore({RocketMQTransactionConfiguration.class}) 
  8.  
  9. public class RocketMQAutoConfiguration { 
  10.     private static final Logger log = LoggerFactory.getLogger(RocketMQAutoConfiguration.class); 
  11.  
  12.     public static final String ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME = 
  13.         "rocketMQTemplate"; 
  14.  
  15.     @Autowired 
  16.     private Environment environment; 
  17.  
  18.     @Bean(destroyMethod = "destroy") 
  19.     @ConditionalOnBean(DefaultMQProducer.class) 
  20.     @ConditionalOnMissingBean(name = ROCKETMQ_TEMPLATE_DEFAULT_GLOBAL_NAME) 
  21.     public RocketMQTemplate rocketMQTemplate(DefaultMQProducer mqProducer, 
  22.         RocketMQMessageConverter rocketMQMessageConverter) { 
  23.         RocketMQTemplate rocketMQTemplate = new RocketMQTemplate(); 
  24.         rocketMQTemplate.setProducer(mqProducer); 
  25.         rocketMQTemplate.setMessageConverter(rocketMQMessageConverter.getMessageConverter()); 
  26.         return rocketMQTemplate; 
  27.     } 
  • @Configuration 說(shuō)明這是一個(gè)配置類(lèi),類(lèi)中被@Bean注解了的方法,就是spring的一個(gè)bean,例如rocketMQTemplate。
  • @EnableConfigurationProperties,啟用被@ConfigurationProperties的bean,這里引入了 RocketMQProperties 。

RocketMQProperties 就是需要在yml文件中寫(xiě)入的屬性。

 
 
 
 
  1. @ConfigurationProperties(prefix = "rocketmq") 
  2. public class RocketMQProperties { 
  3.  
  4.     private String nameServer; 
  5.  
  6.     private String accessChannel; 
  7.  
  8.     private Producer producer; 
  9.  
  10.     private Consumer consumer = new Consumer(); 

在Spring Boot項(xiàng)目啟動(dòng)的時(shí)候默認(rèn)只會(huì)掃描下級(jí)目錄下帶 @Configuration 注解的類(lèi),那么像本文中提到的 RocketMQAutoConfiguration 是如何掃描的呢?其實(shí)項(xiàng)目啟動(dòng)的時(shí)候會(huì)去加載項(xiàng)目中所有的 spring.factories 文件,然后加載對(duì)應(yīng)的配置類(lèi),因此我們就需要在 spring.factories 中只指定需要掃描的類(lèi)。

原理搞明白了,接下來(lái)我們就簡(jiǎn)單實(shí)現(xiàn)一個(gè)自己的starter!這個(gè)starter的主要作用就是給一個(gè)對(duì)象尾部拼接一個(gè)字符串!

一、新建項(xiàng)目

新建一個(gè)名為 javatip-spring-boot-starter 的項(xiàng)目,并且引入下面的依賴(lài)

 
 
 
 
  1.  
  2.     org.springframework.boot 
  3.     spring-boot-starter 
  4.  

二、新增配置類(lèi)

配置類(lèi)對(duì)應(yīng)的properties文件中的屬性為javatip.name;

 
 
 
 
  1. @ConfigurationProperties(prefix = "javatip") 
  2. public class JavatipPorperties { 
  3.  
  4.     private String name; 
  5.  
  6.     public String getName() { 
  7.         return name; 
  8.     } 
  9.  
  10.     public void setName(String name) { 
  11.         this.name = name; 
  12.     } 

三、新增拼接字符串的方法

此方法主要就是為對(duì)象拼接一個(gè)固定的字符串

 
 
 
 
  1. public class StrUt { 
  2.  
  3.     private String name; 
  4.  
  5.     public String strTo(Object object){ 
  6.  
  7.         return object +"---"+ getName(); 
  8.     } 
  9.  
  10.     public String getName() { 
  11.         return name; 
  12.     } 
  13.  
  14.     public void setName(String name) { 
  15.         this.name = name; 
  16.     } 

四、新增自動(dòng)配置類(lèi)

使用注解 @EnableConfigurationProperties 啟用 JavatipProperties 配置類(lèi)

使用注解 @Configuration 配合 @Bean 注冊(cè)一個(gè)拼接字符串的bean對(duì)象。

 
 
 
 
  1. @Configuration 
  2. @EnableConfigurationProperties(JavatipPorperties.class) 
  3. public class JavatipAutoConfiguration { 
  4.  
  5.     @Autowired 
  6.     private JavatipPorperties javatipPorperties; 
  7.  
  8.     @Bean 
  9.     public StrUt strut(){ 
  10.         StrUt strut = new StrUt(); 
  11.         strut.setName(javatipPorperties.getName()); 
  12.         return strut; 
  13.     } 

五、新增配置發(fā)現(xiàn)文件

在resources文件夾中新建 META-INF 文件夾,在 META-INF 文件夾中新建配置發(fā)現(xiàn)文件 spring.factories,并且將自動(dòng)配置類(lèi)寫(xiě)到文件里。

 
 
 
 
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.javatip.str.configuration.JavatipAutoConfiguration 

六、打包測(cè)試

使用 mvn install 命令將項(xiàng)目打包推送到本地maven倉(cāng)庫(kù),然后新建一個(gè)測(cè)試項(xiàng)目,引入打包好的依賴(lài)。

 
 
 
 
  1.  
  2.     com.javatip 
  3.     javatip-spring-boot-starter 
  4.     0.0.1-SNAPSHOT 
  5.  

在 application.yml 文件中寫(xiě)入自動(dòng)拼接的字符串對(duì)應(yīng)的屬性 javatip.name 。

 
 
 
 
  1. javatip: 
  2.   name: Java旅途 

然后手寫(xiě)一個(gè)測(cè)試類(lèi):

 
 
 
 
  1. @RestController 
  2. public class Test { 
  3.      
  4.     @Autowired 
  5.     private StrUt strUt; 
  6.  
  7.     @GetMapping("test") 
  8.     public String test(){ 
  9.  
  10.         String str = strUt.strTo("who are you?"); 
  11.         return str; 
  12.     } 

運(yùn)行測(cè)試類(lèi)后,頁(yè)面返回了

 
 
 
 
  1. who are you?---Java旅途 

這樣,一個(gè)簡(jiǎn)單的starter就寫(xiě)好了,只要理解了starter的原理,實(shí)現(xiàn)起來(lái)就很簡(jiǎn)單,第一點(diǎn)就是starter相當(dāng)于一個(gè)依賴(lài)組,另一點(diǎn)就是starter可以完成初始化配置。

本文轉(zhuǎn)載自微信公眾號(hào)「Java旅途」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java旅途公眾號(hào)。

 


網(wǎng)頁(yè)名稱(chēng):徒手?jǐn)]了一個(gè)Starter,同事直夸我666~
本文地址:http://www.dlmjj.cn/article/dpocses.html