如何自定义starter
背景
使用過Spring Boot的小伙伴都應該知道,一個Spring Boot 項目就是由一個一個 starter 組成的,一個 starter 代表該項目的 Spring Boot 啟動依賴,除了官方已有的 starter,我們可以根據自己的需要自定義新的starter。
我們經常會看到或者使用到各種***-starter。比如下面幾種:
spring-boot-starter-web:嵌入Tomcat和web開發需要的相關jar包
spring-boot-starter-data-redis:redis數據庫支持
mybatis-spring-boot-starter:第三方的mybatis集成的starter
spring-boot -starter-test:用于測試 Spring 引導應用程序
spring-boot-starter-AOP :這個 starter 用于使用 AspectJ 和 Spring AOP 進行面向方面的編程
starter有何用呢?
在我們的日常開發工作中,經常會有一些獨立于業務之外的配置模塊,我們經常將其放到一個特定的包下,然后如果另一個工程需要復用這塊功能的時候,需要將代碼硬拷貝到另一個工程,重新集成一遍,麻煩至極。如果我們將這些可獨立于業務代碼之外的功配置模塊封裝成一個個starter,復用的時候只需要將其在pom中引用依賴即可,Spring Boot為我們完成自動裝配,簡直不要太爽。
比如我們之前做MVC時要引入日志組件,那么需要去找到log4j的版本,然后引入,現在有了Starter之后,直接用這個之后,log4j就自動引入了,也不用關心版本這些問題。
比如我們要在Spring Boot中引入Web MVC的支持時,我們通常會引入這個模塊spring-boot-starter-web,而這個模塊如果解壓包出來會發現里面什么都沒有,只定義了一些POM依賴。
Spring Boot starter機制
Spring Boot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統一集成進starter,應用者只需要在maven中引入starter依賴,Spring Boot就能自動掃描到要加載的信息并啟動相應的默認配置。starter讓我們擺脫了各種依賴庫的處理,需要配置各種信息的困擾。Spring Boot會自動通過classpath路徑下的類發現需要的Bean,并注冊進IOC容器。Spring Boot提供了針對日常企業應用研發各種場景的spring-boot-starter依賴模塊。所有這些依賴模塊都遵循著約定成俗的默認配置,并允許我們調整這些配置,即遵循“約定大于配置”的理念。
自定義starter的條件
如果想自定義Starter,首選需要實現自動化配置,而要實現自動化配置需要滿足以下兩個條件:? ?
能夠自動配置項目所需要的配置信息,也就是自動加載依賴環境;? ? ? ? ?
能夠根據項目提供的信息自動生成Bean,并且注冊到Bean管理容器中;
自定義starter代碼部分
pom.xml依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.0.0.RELEASE</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.0.0.RELEASE</version><optional>true</optional></dependency> </dependencies>根據需要自定義Starter的實現過程大致如下(以我定義的Starter為例):
定義XxxProperties類,屬性配置類,完成屬性配置相關的操作,比如設置屬性前綴,用于在application.properties中配置。
TianProperties代碼:
import org.springframework.boot.context.properties.ConfigurationProperties; @ConfigurationProperties(prefix = "spring.tian") public class TianProperties {// 姓名private String name;// 年齡private int age;// 性別private String sex = "M";//get and set }創建XxxService類,完成相關的操作邏輯 。
TianService代碼:
public class TianService {private TianProperties properties;public TianService() {}public TianService(TianProperties userProperties) {this.properties = userProperties;}public void sayHello(){System.out.println("hi, 我叫: " + properties.getName() +", 今年" + properties.getAge() + "歲"+ ", 性別: " + properties.getSex());} }定義XxxConfigurationProperties類,自動配置類,用于完成Bean創建等工作。
TianServiceAutoConfiguration代碼:
@Configuration @EnableConfigurationProperties(TianProperties.class) @ConditionalOnClass(TianService.class) @ConditionalOnProperty(prefix = "spring.tian", value = "enabled", matchIfMissing = true) public class TianServiceAutoConfiguration {@Autowiredprivate TianProperties properties;@Bean@ConditionalOnMissingBean(TianService.class)public TianService tianService() {return new TianService(properties);} }在resources下創建目錄META-INF,在 META-INF 目錄下創建 spring.factories,在SpringBoot啟動時會根據此文件來加載項目的自動化配置類。
spring.factories中配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.tian.TianServiceAutoConfiguration把上面這個starter工程打成jar包
項目中使用自定義starter
創建一個Spring Boot項目test
在項目中把自定義starter添加pom依賴
<dependency><groupId>com.tian</groupId><artifactId>spring-boot-tian-starter</artifactId><version>1.0-SNAPSHOT</version> </dependency>TestApplication啟動類
@SpringBootApplication @EnableEurekaServer public class TestApplication {public static void main(String[] args) {SpringApplication.run(TestApplication.class, args);} }application.properties中配置
spring.tian.name=tian spring.tian.age=22 spring.tian.sex=M寫一個TestController.java類
RestController @RequestMapping("/my") public class TestController {@Resourceprivate TianService tianService;@PostMapping("/starter")public Object starter() {tianService.sayHello();return "ok";} }jar以來進來后,可以看到
多了一個json的文件
最后啟動項目,輸入
http://localhost:9091/my/starter
后臺打印
hi, 我叫: tian, 今年22歲, 性別: M這就成功的現實了自定義的starter。
總結
Spring Boot在啟動時掃描項目所依賴的JAR包,尋找包含spring.factories文件的JAR包,
然后讀取spring.factories文件獲取配置的自動配置類AutoConfiguration,
然后將自動配置類下滿足條件(@ConditionalOnXxx)的@Bean放入到Spring容器中(Spring Context)
這樣使用者就可以直接用來注入,因為該類已經在容器中了
推薦閱讀
Spring Boot系列文章匯總,值得收藏!!!
往期好文,篇篇都有精彩~
總結
以上是生活随笔為你收集整理的如何自定义starter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下面安装geant4,Ubun
- 下一篇: 无聊与兴奋 《幸福之路》读书笔记