SpringBoot的starter到底是什么?( 四 )

我们可以看到 , 这个文件比较简单就引入了:

  • spring-boot-starter:springboot的相关jar包 。
  • spring-boot-autoconfigure:springboot自动配置相关jar包 。
  • spring-boot-configuration-processor:springboot生成IDE提示功能相关jar包 。
重点看看spring.factories文件:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.sue.IdGenerateAutoConfiguration它里面只包含一行配置,其中key是EnableAutoConfiguration,value是IdGenerateAutoConfiguration 。
再重点看一下IdGenerateAutoConfiguration
@ConditionalOnClass(IdProperties.class)@EnableConfigurationProperties(IdProperties.class)@Configurationpublic class IdGenerateAutoConfiguration {@Autowiredprivate IdProperties properties;@Beanpublic IdGenerateService idGenerateService() {return new IdGenerateService(properties.getWorkId());}}该类是一个使用了@Configuration注解标记为了配置类 , 生效的条件是@ConditionalOnClass注解中检测到包含IdProperties.class 。并且使用@EnableConfigurationProperties注解会自动注入IdProperties的实例 。
此外,最关键的点是该类里面创建了idGenerateService的bean实例,这是自动配置的精髓 。
再看看IdGenerateService
public class IdGenerateService {private Long workId;public IdGenerateService(Long workId) {this.workId = workId;}public Long generate() {return new Random().nextInt(100) + this.workId;}}我们可以看到它是一个普通的类,甚至都没有使用@Service注解,里面有个generate方法,根据workId的值和随机数动态生成id 。
最后看看IdProperties
@ConfigurationProperties(prefix = IdProperties.PREFIX)public class IdProperties {public static final String PREFIX = "sue";private Long workId;public Long getWorkId() {return workId;}public void setWorkId(Long workId) {this.workId = workId;}}它是一个配置实体类 , 里面包含了相关的配置文件 。使用@ConfigurationProperties注解,会自动把application.properties文件中以sue开通的,参数名称跟IdProperties中一样的参数值,自动注入到IdProperties对象中 。
3.3 创建id-generate-test这个项目主要用于测试 。
SpringBoot的starter到底是什么?

文章插图
该项目里面包含:pom.xml、application.properties、Application 和 TestRunner 文件 。
先看看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><version>1.3.1</version><groupId>com.sue</groupId><artifactId>spring-boot-id-generate-test</artifactId><name>spring-boot-id-generate-test</name><dependencies><dependency><groupId>com.sue</groupId><artifactId>id-generate-spring-boot-starter</artifactId><version>1.3.1</version></dependency></dependencies></project>由于只测试刚刚定义的id生成功能,所以只引入的id-generate-spring-boot-starter jar包 。
application.properties配置资源文件
sue.workId=123只有一行配置,因为我们的IdProperties中目前只需要这一个参数 。
Application是测试程序启动类
@SpringBootApplicationpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}很简单,就是一个普通的springboot启动类
TestRunner是我们的测试类
@Componentpublic class TestRunner implements ApplicationRunner {@Autowiredprivate IdGenerateService idGenerateService;public void run(ApplicationArguments args) throws Exception {Long sysNo = idGenerateService.generate();System.out.println(sysNo);}}它实现了ApplicationRunner接口,所以在springboot启动的时候会调用该类的run方法 。
好了 , 所有自定义starter的代码和测试代码都已经就绪 。接下,运行一下Application类的main方法 。
运行结果:
176完美,验证成功了 。
接下来,我们分析一下starter的底层实现原理 。
4 starter的底层原理是什么?通过上面编写自己的starter的例子,相信大家对starter的认识更进一步了,现在跟大家一起看看starter的底层是如何实现的 。
id-generate-starter.jar其实是一个空项目,依赖于id-generate-autoconfiguration.jar 。
id-generate-starter.jar是一个入口,我们给他取一个更优雅的名字:

推荐阅读