自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

徒手?jǐn)]了一個Starter,同事直夸我666~

開發(fā) 前端
Spring Boot 將常見的開發(fā)功能,分成了一個個的starter,這樣我們開發(fā)功能的時候只需要引入對應(yīng)的starter,而不需要去引入一堆依賴了!starter可以理解為一個依賴組,其主要功能就是完成引入依賴和初始化配置。

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

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

一、新建項目

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

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter</artifactId> 
  4. </dependency> 

二、新增配置類

配置類對應(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. <dependency> 
  2.     <groupId>com.javatip</groupId> 
  3.     <artifactId>javatip-spring-boot-starter</artifactId> 
  4.     <version>0.0.1-SNAPSHOT</version> 
  5. </dependency> 

在 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旅途公眾號。

 

責(zé)任編輯:武曉燕 來源: Java旅途
相關(guān)推薦

2021-02-03 09:04:11

解密Spring配置

2020-11-04 07:56:19

工具Linux 翻譯

2021-02-22 11:13:17

VS Code代碼編程

2022-02-19 22:02:21

Redisvalue元素

2020-09-27 10:55:10

代碼Java字符串

2021-02-03 07:56:08

版本游戲邏輯

2020-06-12 09:07:03

技術(shù)總監(jiān)數(shù)據(jù)庫

2020-07-13 08:40:48

同事代碼

2021-11-04 17:23:03

Java對象 immutable

2022-01-21 07:35:06

LRU緩存java

2021-11-29 07:47:57

gRPCGUI客戶端

2023-07-10 09:53:59

console開發(fā)插件

2022-04-22 08:22:50

MVCCMySQLC++

2022-05-07 13:52:22

Feign 增強包K8s

2020-09-27 14:13:50

Spring BootJava框架

2021-09-13 08:41:52

職場互聯(lián)網(wǎng)自閉

2022-05-16 08:42:26

Pandasbug

2021-12-12 18:18:15

代碼元宇宙Python

2020-04-07 08:00:02

Redis緩存數(shù)據(jù)

2021-12-03 11:57:27

代碼##語言
點贊
收藏

51CTO技術(shù)棧公眾號