1SpringFactoriesLoader详解
SpringFactoriesLoader 工厂加载机制是 Spring 内部提供的一个约定俗成的加载方式,与 java spi 类似,只需要在模块的 META-INF/spring.factories 文件中,以 Properties 类型(即 key-value 形式)配置,就可以将相应的实现类注入 Spirng 容器中。Properties 类型格式:
key:是全限定名(抽象类|接口)
value:是实现,多个实现通过 逗号 进行分隔。
loadFactoryNames
读取 classpath上 所有的 jar 包中的所有 META-INF/spring.factories属性文件,找出其中定义的匹配类型 factoryClass 的工厂类,然后并返回这些工厂类的名字列表,注意是包含包名的全限定名。
首先从classpath下每个jar包下搜寻文件名是META-INF/spring.factories的配置文件,然后将解析properties文件,找到指定名称的配置后返回,需要注意的是,这里不仅仅是在classpath路径下查找,会扫描所有路径下的jar包,只不过这个文件只会在classpath下的jar包中。
// 来⾃ org.springframework.boot.autoconfigure下的META-INF/spring.factories
//EnableAutoConfiguration后文会讲到,它用于开启Spring Boot自动配置功能
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
执行loadFactoryNames((EnableAutoConfiguration.class,classLoader)后,得到对应的一组@Configuration类,我们就可以通过反射实例化这些类,然后注入到IOC容器中,最后容器里就有了一系列标注了@Cofiguration的JavaConfig形式的配置类。
2SpringBoot自动配置原理解析
然后就是实例化这些配置类注册到IOC容器中。流程如下:
通过上面的方式,所有的自动配置类都被导进主配置类中,但是这么多的配置类,明显有很多我们平常是没有使用到的,没必要全部生效,下面我们以DataSourceAutoConfiguration配置类为例来看一下自动配置类是如何工作的:
DataSourceProperties 类
- SpringBoot启动时会扫描项目所依赖的JAR包,寻找包含spring.factories文件的JAR包。
- 根据spring.factories配置加载EnableAutoConfiguration
其中给容器中自动配置添加组件的时候,会从propeties类中获取配置文件中指定这些属性的值。xxxAutoConfiguration:⾃动配置类给容器中添加组件。xxxProperties:封装配置⽂件中相关属性。 - 根据@Conditional注解的条件,进行自动配置并将Bean注入Spring容器