日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
徒手擼了一個Starter,同事直夸我666~

[[396095]]

Spring Boot starter原理

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

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

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

在 rocketmq-spring-boot 中有一個自動裝配的類RocketMQAutoConfiguration ,我截取了其中的一小段代碼,一起來看看。

 
 
 
 
  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 說明這是一個配置類,類中被@Bean注解了的方法,就是spring的一個bean,例如rocketMQTemplate。
  • @EnableConfigurationProperties,啟用被@ConfigurationProperties的bean,這里引入了 RocketMQProperties 。

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

 
 
 
 
  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項目啟動的時候默認只會掃描下級目錄下帶 @Configuration 注解的類,那么像本文中提到的 RocketMQAutoConfiguration 是如何掃描的呢?其實項目啟動的時候會去加載項目中所有的 spring.factories 文件,然后加載對應(yīng)的配置類,因此我們就需要在 spring.factories 中只指定需要掃描的類。

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

一、新建項目

新建一個名為 javatip-spring-boot-starter 的項目,并且引入下面的依賴

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

二、新增配置類

配置類對應(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.     } 

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

此方法主要就是為對象拼接一個固定的字符串

 
 
 
 
  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.     } 

四、新增自動配置類

使用注解 @EnableConfigurationProperties 啟用 JavatipProperties 配置類

使用注解 @Configuration 配合 @Bean 注冊一個拼接字符串的bean對象。

 
 
 
 
  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,并且將自動配置類寫到文件里。

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

六、打包測試

使用 mvn install 命令將項目打包推送到本地maven倉庫,然后新建一個測試項目,引入打包好的依賴。

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

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

 
 
 
 
  1. javatip: 
  2.   name: Java旅途 

然后手寫一個測試類:

 
 
 
 
  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.     } 

運行測試類后,頁面返回了

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

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

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

 


當(dāng)前題目:徒手擼了一個Starter,同事直夸我666~
文章位置:http://www.5511xx.com/article/dpocses.html