javascript
Spring Boot - 手把手教小师妹自定义Spring Boot Starter
文章目錄
- Pre
- 自定義starter的套路
- 步驟
- 命名規范
- 官方命名空間
- 自定義命名空間
- 實戰
- 創建一個父maven項目:springboot_custome_starter
- 創建 兩個Module: artisan-spring-boot-starter 和 artisan-spring-boot-starter-autoconfigurer
- artisan-spring-boot-starter (空的jar文件,僅僅提供輔助性依賴管理)
- pom
- artisan-spring-boot-starter-autoconfigurer
- pom
- CustomProperties
- IndexController
- CustomAutoConfiguration 自動配置類
- spring.factories
- 打包發布
- 引用自定義starter測試
Pre
SpringBoot 最強大的功能就是把我們常用的場景抽取成了一個個starter(場景啟動器),我們通過引入springboot 為我提供的這些場景啟動器,再進行少量的配置就能使用相應的功能。
但有些時候,springboot也不能囊括我們所有的使用場景,往往我們需要自定義starter,來簡化我們對springboot的使用。
那怎么搞呢?
自定義starter的套路
參照@WebMvcAutoConfiguration , 看看們需要準備哪些東西
@Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication(type = Type.SERVLET) @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration { ....... }抽取以下
@Configuration //指定這個類是一個配置類 @ConditionalOnXXX //指定條件成立的情況下自動配置類生效 @AutoConfigureOrder //指定自動配置類的順序 @Bean //向容器中添加組件 @ConfigurationProperties //結合相關xxxProperties來綁定相關的配置 @EnableConfigurationProperties //讓xxxProperties生效加入到容器中自動配置類要能加載需要將自動配置類,配置在META-INF/spring.factories中
我們參考下 spring-boot-starter
點擊maven進去
有個 spring-boot-autoconfigure的依賴
步驟
所以總結下
- 啟動器(starter)是一個空的jar文件,僅僅提供輔助性依賴管理,這些依賴可能用于自動裝配或其他類庫。
- 需要專門寫一個類似spring-boot-autoconfigure的配置模塊
- 用的時候只需要引入啟動器starter,就可以使用自動配置了
命名規范
官方命名空間
前綴:spring-boot-starter-
模式:spring-boot-starter-模塊名
舉例:spring-boot-starter-web、spring-boot-starter-jdbc
自定義命名空間
后綴:-spring-boot-starter
模式:模塊-spring-boot-starter
舉例:mybatis-spring-boot-starter
實戰
創建一個父maven項目:springboot_custome_starter
新建一個maven工程, 父工程,pom類型 , src 目錄 和 IDEA自動創建的.md文件,刪除掉
pom 如下
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.6.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><packaging>pom</packaging><groupId>com.artisan.customstarter</groupId><artifactId>starter</artifactId><version>0.0.1-SNAPSHOT</version><name>starter</name><description>SpringBoot自定義starter</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies><build><plugins><!--提供source--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-source-plugin</artifactId><configuration><attach>true</attach></configuration><executions><execution><phase>compile</phase><goals><goal>jar</goal></goals></execution></executions></plugin></plugins></build></project>創建 兩個Module: artisan-spring-boot-starter 和 artisan-spring-boot-starter-autoconfigurer
同樣的方式創建
artisan-spring-boot-starter (空的jar文件,僅僅提供輔助性依賴管理)
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>starter</artifactId><groupId>com.artisan.customstarter</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><description>啟動器(starter)是一個空的jar文件,僅僅提供輔助性依賴管理,這些依賴需要自動裝配或其他類庫。</description><artifactId>artisan-spring-boot-starter</artifactId><dependencies><!--引入autoconfigure--><dependency><groupId>com.artisan.customstarter</groupId><artifactId>artisan-spring-boot-starter-autoconfigurer</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!--如果當前starter 還需要其他的類庫就在這里引用--></dependencies></project>如果使用spring Initializr創建的需要刪除 啟動類、resources下的文件,test文件。
artisan-spring-boot-starter-autoconfigurer
pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>starter</artifactId><groupId>com.artisan.customstarter</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>artisan-spring-boot-starter-autoconfigurer</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--‐導入配置文件處理器,配置文件進行綁定就會有提示--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency></dependencies></project>關于自動提示的jar ,引入spring-boot-configuration-processor之后, 編譯之后就會在META-INF文件夾下面生成一個spring-configuration-metadata.json的文件。
內容如下
【工程結構】
CustomProperties
package com.artisan;import org.springframework.boot.context.properties.ConfigurationProperties;/*** @author 小工匠* @version 1.0* @description: 屬性配置文件* @date 2021/5/22 18:56* @mark: show me the code , change the world*/@ConfigurationProperties("artisan.custom") public class CustomProperties {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;} }IndexController
package com.artisan;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/5/22 18:58* @mark: show me the code , change the world*/@RestController public class IndexController {private CustomProperties customProperties;public IndexController(CustomProperties customProperties) {this.customProperties = customProperties;}@RequestMapping("/")public String index() {return customProperties.getName();}}CustomAutoConfiguration 自動配置類
package com.artisan;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** @author 小工匠* @version 1.0* @description: 模擬給web應用自動添加一個首頁* @date 2021/5/22 18:55* @mark: show me the code , change the world*/@Configuration @ConditionalOnProperty(value = "artisan.custom.name") @EnableConfigurationProperties(CustomProperties.class) public class CustomAutoConfiguration {@AutowiredCustomProperties cus;@Beanpublic IndexController indexController() {return new IndexController(cus);}}spring.factories
在 resources 下創建文件夾 META-INF 并在 META-INF 下創建文件 spring.factories ,內容如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.artisan.CustomAutoConfiguration打包發布
到這兒,我們的配置自定義的starter就寫完了 ,我們artisan-spring-boot-starter 和 artisan-spring-boot-starter-autoconfigurer 安裝成本地jar包。
引用自定義starter測試
新建個spring boot 項目 ,引用剛才的starter
訪問 http://localhost:8080/
咦 ,別忘了你自定義的屬性
重啟后,重新訪問
因為我們開啟了debug=true .找找我們自動裝配的類看看
總結
以上是生活随笔為你收集整理的Spring Boot - 手把手教小师妹自定义Spring Boot Starter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot - 自动配置实例
- 下一篇: SpringBoot - 探究Sprin