自己实现一个Starter
自己實現一個Starter
自己實現SpringBoot里面的Starter
文章目錄
- 自己實現一個Starter
- 原理
- 核心知識
- 開發自己的Starter
- 創建Maven工程
- 編寫Servcie
- 編寫配置屬性類
- 編寫自動配置類
- 最后一步:添加spring.factories文件
- 測試
原理
一個公用是starter我們只需要引入pom文件,SpringBoot就會進行自動配置。那么SpringBoot是如何知道要實例化哪些類,并進行簡單配置呢?
首先,SpringBoot在啟動時會去依賴的Starter包中尋找resources/META-INF/spring.factories 文件,然后根據文件中配置的Jar包去掃描項目所依賴的Jar包,這類似于 Java 的 SPI 機制。
第二步,根據 spring.factories配置加載AutoConfigure類
最后,根據 @Conditional注解的條件,進行自動配置并將Bean注入Spring Context 上下文當中。
我們也可以使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自動配置哪些類。
可以認為starter是一種服務——使得使用某個功能的開發者不需要關注各種依賴庫的處理,不需要具體的配置信息, 由Spring Boot自動通過classpath路徑下的類發現需要的Bean,并織入相應的Bean。舉個栗子,spring-boot-starter-jdbc這個starter的存在, 使得我們只需要在BookPubApplication下用@Autowired引入DataSource的bean就可以,Spring Boot會自動創建DataSource的實例。
核心知識
1. @Conditional注解
核心就是條件注解 @Conditional ,使用方式如下
//當項目當前Classpath存在 HelloService的時候 后面的配置才生效 @ConditionalOnClass(HelloService.class) public class HelloServiceAutoConfiguration {}SpringBoot許多源碼里面,都會出現條件注解,這就是Starter配置的核心之一。
這里舉個栗子:我們自己開發項目引入的mybatis-starter如下
同樣能看到mybatis的spring.factories文件
打開后,如下
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
開發自己的Starter
所謂starter,就是一個普通的Maven項目
我們要實現的starter很簡單, 提供一個Service, 包含一個sayHello() 方法
主要分為下面幾步驟
創建Maven工程
新建一個普通Maven項目
-
命名:這里說下artifactId的命名問題,Spring 官方 Starter通常命名為spring-boot-starter-{name} 如 spring-boot-starter-web。
Spring官方建議非官方Starter命名應遵循{name}-spring-boot-starter的格式。
-
注意其中 spring-boot-configuration-processor 的作用是編譯時生成spring-configuration-metadata.json, 此文件主要給IDE使用,用于提示使用。如在intellij idea中,當配置此jar相關配置屬性在application.yml, 你可以用ctlr+鼠標左鍵,IDE會跳轉到你配置此屬性的類中。
編寫Servcie
public class ExampleService {private String prefix;private String suffix;public ExampleService(String prefix, String suffix) {this.prefix = prefix;this.suffix = suffix;}public String wrap(String word) {return prefix + word + suffix;} }編寫配置屬性類
@ConfigurationProperties("example.service") public class ExampleServiceProperties {private String prefix;private String suffix;public String getPrefix() {return prefix;}public void setPrefix(String prefix) {this.prefix = prefix;}public String getSuffix() {return suffix;}public void setSuffix(String suffix) {this.suffix = suffix;} }其中@ConfigurationPropeties 注解是讀取 application.yml中 以 example.service 開頭的屬性
編寫自動配置類
@Configuration @ConditionalOnClass(ExampleService.class) @EnableConfigurationProperties(ExampleServiceProperties.class) public class ExampleAutoConfigure {private final ExampleServiceProperties properties;@Autowiredpublic ExampleAutoConfigure(ExampleServiceProperties properties) {this.properties = properties;}@Bean@ConditionalOnMissingBean@ConditionalOnProperty(prefix = "example.service", value = "enabled",havingValue = "true")ExampleService exampleService (){return new ExampleService(properties.getPrefix(),properties.getSuffix());}}解釋下用到的幾個和Starter相關的注解:
1. @ConditionalOnClass,當classpath下發現該類的情況下進行自動配置。 2. @ConditionalOnMissingBean,當Spring Context中不存在該Bean時。 3. @ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true"),當配置文件中example.service.enabled=true時。最后一步:添加spring.factories文件
最后一步,在resources/META-INF/下創建spring.factories文件,內容供參考下面:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.xncoding.starter.config.ExampleAutoConfigure如果有多個自動配置類,用逗號分隔換行即可。
OK,完事,運行 mvn:install 打包安裝,一個Spring Boot Starter便開發完成了。
測試
打包好了當然要測試一下看看了。另外創建一個SpringBoot工程,在maven中引入這個starter依賴, 然后在單元測試中引入這個Service看看效果。
<dependency><groupId>com.xncoding</groupId><artifactId>simple-spring-boot-starter</artifactId><version>1.0.0-SNAPSHOT</version> </dependency>修改application.yml配置文件,添加如下內容:
example.service:enabled: trueprefix: pppsuffix: sss測試類
@RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTests {@Autowiredprivate ExampleService exampleService;@Testpublic void testStarter() {System.out.println(exampleService.wrap("hello"));} }運行結果
ppphellosss總結
以上是生活随笔為你收集整理的自己实现一个Starter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八、基于FPGA的以太网协议介绍(一)
- 下一篇: java实现将多个word文档合并