感悟: 说起spring就会想起其中的springboot 其是为了简化spring应用的初始搭建以及其的初始搭建, 其中最著名的是其摒弃了xml的开发,那么如何摒弃的, 因此就要引出我想讲述的重点: 自动配置: 意义:当springboot项目启动时,会加载配置类和属性类 其中配置类的作用是:将一些核心的组件交由工厂管理,配置类中使用了属性类进行属性注入,而属性类又会读取到配置文件中的配置,使得springboot完成自动配置的整个过程。 方便之处在于:我们每次使用springboot的时候只用写其配置文件,就可以实现我们所想要得到的功能,因为其底层已经在启动器中封装好配置类和属性类; 现在我们来说下其底层到底是如何配置的: 一 : 首先:找到入口类 ,发现@SpringBootApplication注解,这个注解是由三个注解构成 (1)@ComponentScan 包扫描 当入口类在主包下,则扫描的是主包下的所有子包 (2)@Configuration 声明当前类为配置类 (3)@EnableAutoConfiguration 开启自动配置 二 : 找到其中自动配置注解 进入其中发现上面有个注解@Import注解 其括号中的参数为 EnableAutoConfigurationImportSelector 这个注解的作用是将对象放入工厂的第四种方式, 若想使用需要实现selectImport接口 ,并实现其中的方法,selectImports 该方法的参数为AnnotationMetadata 该参数的作用为基于import操作的配置类的元信息运算并返回计算结果 其返回值类型为string字符串 这个字符串传入的值为类的全限定名 因import注解是以累的全限定名作为其的唯一标识 三: 进入上述方法发现,其并没有实现接口selectImport 而是继承了 AutoConfigurationImportSelector的类,那么想到也许该类的父类实现了接口, 因此进入其中,发现果真在其中找到了方法selectImports 四: 在该方法中有个判断,判别该方法是否启用自动配置,如不启用则直接返回空字符串, 这样也就不会有方法,或者说有功能完成了自动配置 如果该方法启用自动配置,下面便返回了一个List集合,这个集合中调用了一个方法 getCandidateConfigurations()这个方法第五步会详细解析。 该方法中是通过springFactoriesLoader找到所有的候选配置类(auto-configuration类) 然后在此基础上进行去重,排序和剔除操作,最终得到需要进行的auto-configuration类的所有类的名称, 拿到所有auto-configuration类以后springboot会加载这些类,由于这些类本身标注了configuation注解,就会被ConfigurationClassParser类进行解析,其中利用@Bean工厂方式被调用,完成bean的加载 五: 上述的getCandidateConfigurations()方法: 该方式是利用SpringFactorLoader抽象类中的方法loadFactoryNames 其中所传的参数为所有加注解的类对象,然后该方法去加载所有的 META-INF/spring.factories文件,找到所对应的类,将其解析成properties对象,在根据key(指定的class名称(启动器))来获取所有的配置项(类名称) 小结: @EnableAutoConfiguration @ImportSelector @SpringFactoryiesLoader 通过@EnableAutoConfiguration注解驱动引入AutoConfigurationImportSelector, 该类通过SpringFactorLoader加载所有的META-INF/spring.factories文件,获取到所有的auto-configuration候选类,然后进行去重,排序和剔除操作得到待处理的auto-configuration类。