首先說說原理,咱們知道使用一個公用的starter的時候,只須要將相應的依賴添加的Maven的配置文件當中便可,免去了本身須要引用不少依賴類,而且SpringBoot會自動進行類的自動配置。那麼 SpringBoot 是如何知道要實例化哪些類,並進行自動配置的呢? 下面簡單說一下。html
首先,SpringBoot 在啓動時會去依賴的starter包中尋找 resources/META-INF/spring.factories 文件,而後根據文件中配置的Jar包去掃描項目所依賴的Jar包,這相似於 Java 的 SPI 機制。java
## 第二步 第二步,根據 spring.factories配置加載AutoConfigure類。web
最後,根據 @Conditional註解的條件,進行自動配置並將Bean注入Spring Context 上下文當中。spring
咱們也可使用@ImportAutoConfiguration({MyServiceAutoConfiguration.class}) 指定自動配置哪些類。json
建立一個SpringBoot 項目,並添加下面兩個依賴到pom.xml文件當中app
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies>
其中 spring-boot-configuration-processor 的做用是編譯時生成 spring-configuration-metadata.json ,此文件主要給IDE使用。如當配置此jar相關配置屬性在 application.yml ,你能夠用ctlr+鼠標左鍵點擊屬性名,IDE會跳轉到你配置此屬性的類中。spring-boot
咱們平常使用的Spring官方的Starter通常採起spring-boot-starter-{name} 的命名方式,如 spring-boot-starter-web 。測試
而非官方的Starter,官方建議 artifactId 命名應遵循{name}-spring-boot-starter 的格式。 例如:ysc-spring-boot-starter 。this
<groupId>com.ysc</groupId> <artifactId>simple-spring-boot-starter</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>jar</packaging>
編寫咱們的Service類. == 功能類code
這裏講一下咱們的Starter要實現的功能,很簡單,提供一個Service,包含一個可以將配置文件中配置的字符串根據傳入的字符進行分割的方法String[] split(String separatorChar)。
public class StarterService { private String config; public StarterService(String config) { this.config = config; } public String[] split(String separatorChar) { return StringUtils.split(this.config, separatorChar); } }
@ConfigurationProperties("example.service") public class StarterServiceProperties { private String config; public void setConfig(String config) { this.config = config; } public String getConfig() { return config; } }
## 第四步, 編寫AutoConfigure類 ,這步是關鍵點
@Configuration @ConditionalOnClass(StarterService.class) @EnableConfigurationProperties(StarterServiceProperties.class) public class StarterAutoConfigure { @Autowired private StarterServiceProperties properties; @Bean @ConditionalOnMissingBean @ConditionalOnProperty(prefix = "example.service", value = "enabled", havingValue = "true") StarterService starterService (){ return new StarterService(properties.getConfig()); } }
在resources/META-INF/下建立spring.factories文件,並添加以下內容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autocinfigure.StarterAutoConfigure