Spring starter
文章目录
疑问
第三方框架的组件,并不在我们业务项目的包路径下,如果想要被Spring容器管理,那该怎么办呢?
starter机制的使用
以日志的落库为例
1.必要的pom依赖
2. 编写factories文件
配置接口的实现类名称,spring 启动时会依据改配置进行注入
3.配置类编写
4.有关业务实现
此部分与业务强相关,根据个人业务需求自行实现,不做展示

FAQ
Question1
pom中指定了有关依赖的版本是否会造成冲突?
maven对于依赖是依据tree的路径进行判别的优先使用本系统下的版本信息
Question2
Condition的操作除了常规的还有那些?
其实Condition为接口,实现有关实现类,利用@Condition(value=XXXCondition.class) 就可以自行控制有关条件
spring starter的原理
关键技术点
factories文件是怎么被识别的?
springBoot在启动时,会CLASSPATH下的每个Jar包中遍历搜寻所有META-INF/spring.factories配置文件,并将对于的配置返回,在启动时依据配置类中接口全称进行注入可以认为是spi机制在spring的使用。
spi机制
为解耦的情况下实现启用框架扩展和替换组件,java内置了一种服务提供发现的机制。具体原理与其他方向的使用可参见引用中的文章。
Condition
由于项目中经常要依据各种情况去实现Bean的管理。Spring提供了Condition机制进行
可查看 org.springframework.context.annotation.Condition中的具体实现,总结来说,可以依据配置,依据其他Bean的注入情况,依据环境等进行条件性的注入。
spring的源码分析
可以认为Condition与SpringStarter机制都是Spring 在实现IOC的基础功能的增强,因此一下源码忽略IOC中讲解,直接介绍在IOC流程中是如何实现的。
spring.factories的load流程
@EnableAutoConfiguration中包括了@Import({AutoConfigurationImportSelector.class}) 可以认为此部分为入口,进行分析
AutoConfigurationImportSelector的源码
AutoConfigurationImportSelector 实现ImportSelector接口。依据ImportSelector的定义可以判断,selectImports方法提供需要注入的Bean信息。
根据以上判断进入getAutoConfigurationEntry方法中,configurations是进行了获取候选的Configuration后进行排序与过滤后的数据,即getCandidateConfigurations获取有关配置信息。
可以看到这里进行了一个断言,其中的含义指的是必须存在springFactories文件的存在。
ConditionalOnProperty的源码分析
Condition类用于Configuration中所以直接以ConfigurationClassPostProcessor为入口,在做Configuration的后置操作时会将@Bean等注释进行解析由Reader进行处理。可看processConfigBeanDefinitions方法
其中 ConfigurationClassBeanDefinitionReader中会new 一个ConditionEvaluator 用于进行Condition的操作
ConditionEvaluator#shouldSkip