首先说说原理,咱们知道使用一个公用的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