github:github.com/Ccww-lx/Spr…
模块:spring-boot-starter-base-service
SpringBoot的方便快捷主要体现之一starter pom
,Spring Boot
为我们提供了简化企业级开发绝大多数场景的starter pom
, 只要使用了应用场景所需要的starter pom
,只需要引入对应的starter
即可,即可以得到Spring Boot
为我们提供的自动配置的Bean
。
然而,可能在很多情况下,我们需要自定义stater
,这样可以方便公司内部系统调用共同的配置模块的时候可以自动进行装载配置。比如,很多公司将生产数据库的密码托管在公司的另外一个专门管理生产密码的系统上,公司每个系统需要使用的时候都需要调用其方法进行使用,现在可以通过starter
自动配置的形式进行配置。
- SpringBoot Starter源码分析
Q:@SpringBootApplication
注解中核心注解@EnableAutoConfiguration
注解在starter起什么作用呢?
@EnableAutoConfiguration
源码分析:
1 | 复制代码@Target(ElementType.TYPE) |
可以从源码看出关键功能是@import
注解导入自动配置功能类AutoConfigurationImportSelector
类,主要方法getCandidateConfigurations()
使用了SpringFactoriesLoader.loadFactoryNames()
方法加载META-INF/spring.factories的文件(spring.factories声明具体自动配置)。
1 | 复制代码protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, |
Q:通常情况下,starter
会根据条件进行操作处理,比如根据不同条件创建不同Bean
。在SpringBoot
有哪些注解可用呢?
可使用org.springframwork.boot.autoconfigure.condition
的条件注解,具体如下所示:
注解 | 解析 |
---|---|
@ConditionalOnBean | 当容器里有指定的Bean的条件下。 |
@ConditionalOnClass | 当类路径下有指定的类的条件下。 |
@ConditionalOnExpression | 基于SpEL表达式作为判断条件。 |
@ConditionalOnJava | 基于JVM版本作为判断条件。 |
@ConditionalOnJndi | 在JNDI存在的条件下查找指定的位置。 |
@ConditionalOnMissingBean | 当容器里没有指定Bean的情况下。 |
@ConditionalOnMissingClass | 当类路径下没有指定的类的条件下。 |
@ConditionalOnNotWebApplication | 当前项目不是Web项目的条件下。 |
@ConditionalOnProperty | 指定的属性是否有指定的值。 |
@ConditionalOnResource | 类路径是否有指定的值。 |
@ConditionalOnSingleCandidate | 当指定Bean在容器中只有一个, 或者虽然有多个但是指定首选的Bean。 |
@ConditionalOnWebApplicatio | 当前项目是Web项目的条件下。 |
- 自定starter
在此将模拟公司获取生产密码模块进行自定义starter demo
2.1 核心依赖
1 | 复制代码<dependencyManagement> |
2.2 服务类service以及属性配置注入
PasswordService
服务类:
1 | 复制代码public class PasswordService { |
属性配置类:
1 | 复制代码//通过@ConfigurationProperties注解获取属性值 |
配置属性使用类:
1 | 复制代码public class BaseStarterService { |
其他类:
1 | 复制代码//判断是否windows系统 |
2.3自动配置类
代码解读:
@EnableConfigurationProperties
:读取配置文件的属性@Import
:导入其他配置类或者自定义类@Conditional
:判断当前环境是否为windows,是则注册该类@ConditionalOnProperty
:判断属性spring.project.ThirdPartySystemService.isPassword
是否等于true
,不为true
则不注册该类@ConditionalOnClass
:判断IOC容器中是否存在ThirdPartySystemService
类,存在则创建PasswordService bean
1 | 复制代码@Configuration |
2.4 注册配置
想自动配置生效, 需要注册自动配置类,即在src/main/resources
下新建METAINF/spring.factories
。在spring.factorie
配置如下:
1 | 复制代码org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ |
若有多个自动配置, 则用“,”隔开, 此处“\”是为了换行后还能够读取到属性。
- 测试自定义starter
3.1 import 依赖
1 | 复制代码 <dependencies> |
3.2 application.properties属性
application.properties
文件有对应的字段是否启动自定义starter,还可以设置starter所需的属性。如下所示:
1 | 复制代码//自定义Starter配置 |
4.总结
由上所述, starter
的大体的工作流程:
SpringBoot
启动时会自动搜索包含spring.factories
文件的JAR包;- 根据
spring.factories
文件加载自动配置类AutoConfiguration
; - 通过
AutoConfiguration
类,加载满足条件(@ConditionalOnXxx)
的bean
到Spring IOC
容器中; - 使用者可以直接使用自动加载到
IOC
的bean
。
各位看官还可以吗?喜欢的话,动动手指点个💗,点个关注呗!!谢谢支持!
欢迎关注公众号【**Ccww技术博客**】,原创技术文章第一时间推出
本文转载自: 掘金