Spring Boot深度实践之自动装配( 四 )


新建一个配置类 , 并标注上@Configuration和@ConditionalOnProperty
Spring Boot深度实践之自动装配
本文插图
进入到@ConditionalOnProperty,发现其条件判断由OnPropertyCondition实现 , 源码如下:
Spring Boot深度实践之自动装配
本文插图
这里我们忽略具体逻辑实现 , 只看其实现流程 。 再进入到OnPropertyCondition类中 , 贴上类图:
Spring Boot深度实践之自动装配
本文插图
从图中能看到 , OnPropertyCondition继承了SpringBootCondition , 而SpringBootCondition实现了Condition , 上文我们说到 , 判断配置类是否注入需要实现Condition中的matches方法 , 此时我们进入SpringBootCondition , 发现matches方法已被其实现 , 如下图所示:
Spring Boot深度实践之自动装配
本文插图
所以OnPropertyCondition作为子类也会继承这个方法实现 , 最终OnPropertyCondition作为@Conditional的判断条件 , 根据其内部的matches方法返回值判断组件是否能被注入 。
以上就是Spring Framework手动装配的几种方式 , 限于篇幅 , 在这里只是粗略的做个介绍 , 有兴趣的同学可以去更深入的了解下 。
说完了Spring Framework的手动装配 , 自然该说到基于Spring Framework手动装配的SpringBoot自动装配了 。
Spring Boot自动装配
Spring Boot 自动装配定义
定义:基于约定大于配置的原则 , 实现Spring组件自动装配的目的 。
在Spring Boot中 , 约定大于配置可以从以下两个方面来理解:

  1. 开发人员仅需规定应用中不符合约定的部分 。
  2. 在没有规定配置的地方 , 采用默认配置 , 以力求最简配置为核心思想 。 简单来说 , 就是减少人为配置 , 尽量使用默认配置 。 这样可以大大减少配置工作 , 这就是所谓的“约定” 。
Spring Boot自动装配的底层实现机制:模式注解 , @Enable模块 , 条件装配 , 工厂加载机制 , 其中模式注解 , @Enable模块 , 条件装配在上文已经提到 , 而工厂加载机制其实也是Spring Framework中的一个机制 , 我们来看看其是如何实现的 。
Spring工厂加载机制
Spring Framework中有一个SpringFactoriesLoader类 , 它是实现工厂加载机制的核心 。
他的主要作用是从META-INF/spring.factories文件中加载指定接口的实现类 , 该文件可能存在于工程类路径下或jar包内 , 所以会存在多个spring.factories文件 。 下图所示META-INF/spring.factories路径配置在其源码中 。
Spring Boot深度实践之自动装配
本文插图
SpringFactoriesLoader通过它的loadFactories方法从FACTORIES_RESOURCE_LOCATION文件中实例化指定类型的工厂实现类 , 且spring.factories文件必须采用Properties格式 , 我们来看看一个spring.factories文件内部是怎样的:
Spring Boot深度实践之自动装配
本文插图
可以看到在该文件中 , 键是接口或抽象类的全路径名 , 值是逗号分隔的实现类列表 。 至于SpringFactoriesLoader具体是如何实例化这些实现类列表的 , 接下来我会以Spring Boot自动装配为例说明 。
Spring手动装配和Spring工厂加载机制在Spring Boot自动装配中的应用
在我们开启Spring的自动装配功能时 , 会使用到@EnableAutoConfiguration这个注解 , 贴上其源码:


推荐阅读