成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開(kāi)發(fā) 前端
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)和初始化配置。

[[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. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter</artifactId> 
  4. </dependency> 

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

在 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)。

 

責(zé)任編輯:武曉燕 來(lái)源: 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元素

2021-02-03 07:56:08

版本游戲邏輯

2020-09-27 10:55:10

代碼Java字符串

2020-06-12 09:07:03

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

2021-11-04 17:23:03

Java對(duì)象 immutable

2022-01-21 07:35:06

LRU緩存java

2021-11-29 07:47:57

gRPCGUI客戶(hù)端

2020-07-13 08:40:48

同事代碼

2023-07-10 09:53:59

console開(kāi)發(fā)插件

2022-04-22 08:22:50

MVCCMySQLC++

2022-05-07 13:52:22

Feign 增強(qiáng)包K8s

2022-05-16 08:42:26

Pandasbug

2021-09-13 08:41:52

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

2020-09-27 14:13:50

Spring BootJava框架

2020-09-10 06:58:34

C語(yǔ)言DBProxy

2021-12-12 18:18:15

代碼元宇宙Python

2020-04-07 08:00:02

Redis緩存數(shù)據(jù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 中文字幕精品一区 | 中文字幕电影在线观看 | 国产亚洲一区二区三区 | 91高清视频在线 | 狠狠操婷婷 | 中文字幕一区二区三区精彩视频 | 国产成人免费视频 | 久草福利| 亚洲成人精选 | 羞羞涩涩在线观看 | 欧洲亚洲视频 | 国产成人精品一区二 | 日韩电影免费在线观看中文字幕 | 黄片毛片免费观看 | 九九99精品| 黄网免费看 | 9porny九色视频自拍 | 中文字幕国产视频 | 国产一级片在线观看视频 | 亚洲国产精品久久久久婷婷老年 | 天天爱天天操 | 欧美精品在线一区二区三区 | 超碰在线观看97 | 国产精品一区二区精品 | 亚洲精品视频三区 | 成人动漫一区二区 | 精品久久久一区 | 黄色骚片 | 成人一级黄色毛片 | 2018国产大陆天天弄 | 久久精品亚洲精品国产欧美 | 一区二区高清 | 欧美日韩在线精品 | 午夜在线视频 | se婷婷| 有码在线 | 久久免费小视频 | 国产成人综合在线 | 久久久激情 | 国产伊人久久久 | 精品99爱视频在线观看 |