spring-boot-自动装配原理
SpringBoot
启动的时候通过@EnableAutoConfiguration
注解找到META-INF/spring.factories
文件中的所有自动配置类,并对其加载,这些自动配置类都是以AutoConfiguration结尾来命名的。它实际上就是一个JavaConfig
形式的IOC
容器配置类,通过特殊的结尾命名类来取得在全局配置文件中配置的属性。
自动装配原理解析
首先在遇到上述文字并且理解不了之时,学着静下心来将文字拆,不管面对任何事情,小船夫们记住将大问题拆分为小问题,这是一种大智慧!!!
- SpringBoot启动会加载大量的自动配置类
- 我们需要明白一点:那就是我们写的功能是否在
SpringBoot
默认的配置类中 - 只要我们需要的组件存在配置类中,我们就不需要在手动配置类
- 在容器中给自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性的值即可
在了解了自动装配的原理之后,我们来关注一个细节问题,自动装配是在什么情况下面生效的?那么我们怀着疑问来探究一下 @ C o n d i t i o n a l \color{#FF00FF}{@Conditional} @Conditional派生注解
@Conditional
必须是
@Conditional
指定的条件成立,才给容器中添加组建,配置里面的内容才生效
@Conditional扩展注解 | 作用(判断是否满足当前指定的条件) |
---|---|
@ConditionalOnJava | 系统的java版本是否符合指定要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选 |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下面是否存在指定的资源文件 |
@ConditionalOnWebApplication | 当前是否是Web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | Jndi存在指定项 |
注意
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口
判断自动配置类是否生效
我们可以使用
debug = true
属性;来让控制台打印自动配置报告,这样我就很容易知道那些配置类生效了。
代 码 实 例 \color{#FF7D00}{代码实例} 代码实例
# 开启springboot的调试类
debug = true
然后,我们即可在控制台看输出日志