一、前言
上一篇分析了源码,看的相当头大,这一篇写一个小结来加深印象吧。由于自动配置原理中用到了很多条件注解,这里也记录一下常用的条件注解,方便速查。
二、条件注解
功能:按照一定的条件进行判断,如果满足条件则给容器注册bean。
分类:
- @ConditionalOnBean :仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
- @ConditionalOnClass :某个class位于类路径上,才会实例化一个Bean。
- @ConditionalOnExpression :当表达式为true的时候,才会实例化一个Bean。基于SpEL表达式的条件判断。
- @ConditionalOnMissingBean
- @ConditionalOnMissingClass
- @ConditionalOnNotWebApplication
- @ConditionalOnWebApplication
- @ConditionalOnNotWebApplication
- @ConditionalOnProperty
- @ConditionalOnJava
- @ConditionalOnResource
- @ConditionalOnJndi
- @ConditionalOnSingleCandidate
三、SpringBoot自动配置的原理
- 1、【加载】从META-INF/spring.factories配置文件中加载自动配置类。
- 2、【排除】排除掉@EnableAutoConfiguration注解的exclude属性指定的自动配置类。
- 3、【过滤】然后再用AutoConfigurationImportFilter接口去过滤自动配置类是否符合其标注注解(若有标注的话)@ConditionalOnClass,@ConditionalOnBean和@ConditionalOnWebApplication的条件,若都符合的话则返回匹配结果。
- 4、【事件回调】然后触发AutoConfigurationImportEvent事件,告诉ConditionEvaluationReport条件评估报告器对象来分别记录符合条件和exclude的自动配置类。
- 5、【导入IOC容器】最后Spring再将筛选后的自动配置类导入IOC容器中。
四、Spring Boot内部组成和其作用【重要】
如果我们注意观察的话,Spring Boot内部核心的类命名规范很多都是类似的,我们来简单总结一下:
- xxxAutoConfiguration :自动配置类,用于给容器中添加组件,从而代替之前我们手动完成大量繁琐的配置。
- xxxProperties : 封装了对应自动配置类的默认属性值,如果我们需要自定义属性值,只需要根据xxxProperties寻找相关属性在配置文件设值即可。