自动配置类
Spring Factories实现原理
spring.factories
文件中,包含了项目需要的配置类。
spring-core
包里定义了SpringFactoriesLoader
类,这个类实现了检索META-INF/spring.factories
文件,并获取指定接口的配置的功能。在这个类中定义了两个对外的方法:loadFactoryNames
、loadSpringFactories
。
第二个方法会遍历整个ClassLoader中所有jar包下的spring.factories
文件。也就是说,我们可以在自己的jar中配置spring.factories文件,不会影响到其他地方的配置,也不会被别人的配置覆盖掉。
spring.factories
是通过Properties解析得到的,所以我们在写文件的内容都是按照下面这种方式配置的:
com.xxx.interface=com.xxx.classname
如果一个接口希望配置多个实现类,可以使用“,”进行分割。
在SpringBoot的很多包中都能够找到spring.factories
文件。
在SpringBoot中,使用最多的就是starter。starter可以理解为一个可拔插式的插件,例如,想使用JDBC插件,那么可以使用spring-boot-starter-jdbc;如果想使用MongoDB,可以使用spring-boot-starter-data-mongodb。
starter和普通jar包的区别在于,它能够实现自动配置,和SpringBoot无缝衔接,从而大大节省开发时间。
自动配置类原理
在spring-boot-autoconfigure
中的spring.factories
里面保存着springboot的默认提供的自动配置类。
例子:HttpEncodingAutoConfiguration
HttpEncodingAutoConfiguration
是一个http编码转换的自动配置类。
在HttpEncodingAutoConfiguration
类上有许多配置相关的注解,其作用如下图:
条件判断
@Conditional
派生注解(Spring注解版原生的@Conditional
作用)
作用: 必须是@Conditional
指定的条件成立,才给容器中添加组件,配置配里面所有的内容才生效:
@Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
@ConditionalOnJava | 系统的java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定的Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnExpression | 满足SpEL表达式指定 |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissClass | 系统中没有指定的类 |
@ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选Bean |
@ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
@ConditionalOnResource | 类路径下是否存在指定资源文件 |
@ConditionalOnWebApplication | 当前是web环境 |
@ConditionalOnNotWebApplication | 当前不是web环境 |
@ConditionalOnJndi | JNDI存在指定项 |
精髓
- SpringBoot启动会加载大量的自动配置类
- 我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
- 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定。