基本介绍
在我们平时的Springboot应用程序开发中,我们经常把我们需要的starter引入,这样程序启动时就会把这个starter的相关功能自动配置到spring的应用程序容器中
,可以极大地简化我们的Spring应用程序开发和配置过程。
比如spring-boot-starter-web这个starter我们应该都很熟悉,通过引入这个starter我们程序就已经有了web服务器、springmvc等基本能力;
相较于传统的非springboot的web开发免去了引入相关依赖并编写众多配置文件的令人头疼的过程。
原理分析
SPI机制
SPI(Service Provider Interface),springboot的一种服务发现机制规范。具体实现形式是通过在项目resources里添加的spring.factories文件来指定
需要扫描的配置类去初始化到容器里。
扫描流程
1、使用SpringApplication启动springboot程序
SpringApplication.run(YeeeAppBootstrapApplication.class, args);
2、程序启动过程中,会调用到spring的AbstractApplicationContext刷新上下文,这个过程中会涉及到BeanDefinitions的定义及初始化
refreshContext(ConfigurableApplicationContext context)
3、在refresh过程中,会有专门的ConfigPostProcessors来读取classes/META-INF/spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类
,将其注册到BeanDefinitions中... invokeBeanFactoryPostProcessors(beanFactory); ... // 读取spring.factories文件中以EnableAutoConfiguration类标识的所有需要扫码的配置类 List<String> configurations = SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class); ... // 注册到BeanFactory的beanDefinitionNames中 processConfigBeanDefinitions(BeanDefinitionRegistry registry) ...
- 4、refresh最后就是BeanDefinitions的初始化了。
finishBeanFactoryInitialization(beanFactory);
怎么构建自定义的starter?
案例:swagger2的公共starter
场景描述
在我们项目开发中swagger显然已经必不可少,在没有构建公共的starter后,我们每次使用swagger都需要引入许多依赖并且
还得写一些额外的配置类来初始化它;在封装成starter后我们只需要在pom中引入这个starter并且不需要额外配置就可以拥有这个功能。
具体构建过程
- 1、新建maven项目base-swagger,并且在/src/main/resources中新增文件夹METAINF,然后在METAINF中增加spring.factories文件
- 2、编写swagger相关的配置类
3、编写主配置类,并把全路径名写到spring.factories中
```java
@ComponentScan({"vip.yeee.memo.base.swagger.config", "springfox.documentation.schema"})
public class SwaggerAutoConfigure {public SwaggerAutoConfigure() {
log.info("自动配置-swagger");
}
}
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
vip.yeee.memo.base.swagger.SwaggerAutoConfigure
- 4、在需要使用swagger的项目pom中引入该starter
```xml
<dependency>
<groupId>vip.yeee.memo</groupId>
<artifactId>base-swagger</artifactId>
</dependency>
- Github详细代码
// 1.自定义starter项目
https://github.com/yeeevip/yeee-memo/tree/master/memo-parent/memo-base/base-swagger
版权 本文为yeee.vip原创文章,转载无需和我联系,但请注明来自https://www.yeee.vip