快速開發一個自定義 Spring Boot Starter,並使用它
https://juejin.im/entry/58d37630570c350058c2c15c
眾所周知(不知道?點此),Spring Boot由眾多Starter組成,隨著版本的推移Starter家族成員也與日俱增。在傳統Maven專案中通常將一些層、元件拆分為模組來管理,以便相互依賴複用,在Spring Boot專案中我們則可以建立自定義Spring Boot Starter來達成該目的。
好,開始,先建立一個Maven專案並引入依賴,pom.xml
如下,供參考~
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
這裡說下artifactId
的命名問題,Spring 官方 Starter通常命名為spring-boot-starter-{name}
如 spring-boot-starter-web
, Spring官方建議非官方Starter命名應遵循{name}-spring-boot-starter
的格式。
這裡講一下我們的Starter要實現的功能,很簡單,提供一個Service
,包含一個能夠將字串加上前字尾的方法String wrap(String word)
。
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;
}
}
字首、字尾通過讀取application.properties(yml)
內的引數獲得
@ConfigurationProperties("example.service")
public class ExampleServiceProperties {
private String prefix;
private String suffix;
//省略 getter setter
重點,編寫AutoConfigure
類
@Configuration
@ConditionalOnClass(ExampleService.class)
@EnableConfigurationProperties(ExampleServiceProperties.class)
public class ExampleAutoConfigure {
@Autowired
private ExampleServiceProperties properties;
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")
ExampleService exampleService (){
return new ExampleService(properties.getPrefix(),properties.getSuffix());
}
}
解釋下用到的幾個和Starter相關的註解:
@ConditionalOnClass
,當classpath
下發現該類的情況下進行自動配置。@ConditionalOnMissingBean
,當Spring Context
中不存在該Bean
時。@ConditionalOnProperty(prefix = "example.service",value = "enabled",havingValue = "true")
,當配置檔案中example.service.enabled=true
時。
更多相關注解,建議閱讀官方文件該部分。
最後一步,在resources/META-INF/
下建立spring.factories
檔案,內容供參考下面~
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.ExampleAutoConfigure
OK,完事,執行 mvn:install
打包安裝,一個Spring Boot Starter便開發完成了。如果你需要該Starter的原始碼,點這裡。
建立一個Spring Boot專案來 試試~
引入example-spring-boot-starter
依賴
<dependency>
<groupId>com.example</groupId>
<artifactId>example-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
建立application.properties
,進行配置
example.service.enabled=true
example.service.prefix=####
example.service.suffix=@@@@
建立一個簡單的Spring Web Application,注入Starter提供的ExampleService
看它能否正常工作~
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Autowired
private ExampleService exampleService;
@GetMapping("/input")
public String input(String word){
return exampleService.wrap(word);
}
}
啟動Application,訪問/input
介面試試看~
總結下Starter
的工作原理
Spring Boot
在啟動時掃描專案所依賴的JAR包,尋找包含spring.factories
檔案的JAR包- 根據
spring.factories
配置載入AutoConfigure
類 - 根據
@Conditional
註解的條件,進行自動配置並將Bean
注入Spring Context
相關文章
- 自定義 Spring Boot StarterSpring Boot
- Spring Boot 自定義 starterSpring Boot
- 自定義Spring Boot StarterSpring Boot
- 【spring-boot】自定義starterSpringboot
- 開發一個Spring Boot Starter!Spring Boot
- 最詳細的自定義Spring Boot Starter開發教程Spring Boot
- 快速建立一個spring-boot-starterSpringboot
- (第五講)自定義Spring Boot StarterSpring Boot
- 小代學Spring Boot之自定義StarterSpring Boot
- 自定義spring boot starter三部曲之二:實戰開發Spring Boot
- Spring Boot四大神器之建立自定義StarterSpring Boot
- 自定義spring boot starter三部曲之一:準備工作Spring Boot
- Spring Boot系列(一):Spring Boot快速開始Spring Boot
- java Spring Cloud企業快速開發架構之Spring Boot Starter的介紹及使用JavaCloud架構Spring Boot
- SpringBoot自定義StarterSpring Boot
- SpringBoot 自定義 starterSpring Boot
- 建立自己的定製的Spring Boot Starter快速指南Spring Boot
- 4、製作一個html轉pdf的spring boot starterHTMLSpring Boot
- spring-boot-starter-testSpringboot
- SpringBoot應用篇(一):自定義starterSpring Boot
- Spring Boot 自定義註解失效Spring Boot
- Spring Boot - 自定義 Banner 圖案Spring Boot
- Spring Boot Starter 和 ABP ModuleSpring Boot
- 理解spring-boot-starter-parentSpringboot
- 自研 Pulsar Starter:winfun-pulsar-spring-boot-starterSpringboot
- SpringBoot自定義starter開發分散式任務排程實踐Spring Boot分散式
- 聊聊arthas的spring-boot-starterSpringboot
- fast-spring-boot快速開發專案ASTSpringboot
- 手把手教你手寫一個最簡單的 Spring Boot StarterSpring Boot
- 實戰|如何自定義SpringBoot Starter?Spring Boot
- Spring Boot讀取自定義外部屬性Spring Boot
- Spring Boot之自定義JSON轉換器Spring BootJSON
- Spring Boot 自動配置的原理、核心註解以及利用自動配置實現了自定義 Starter 元件Spring Boot元件
- 記一次自定義starter引發的線上事故覆盤
- Jasypt工具類(jasypt-spring-boot-starter)Springboot
- spring-boot - 編寫自己的starterSpringboot
- 如何實現自己的Spring Boot StarterSpring Boot
- Spring Boot自動配置原理懂後輕鬆寫一個自己的starterSpring Boot