Java学习之SpringBoot如何实现自动配置
SpringBoot是Spring全家桶中一个具有‘跨时代’的项目框架,它减去以往传统架构繁琐的配置文件,而且可以内嵌Tomcat,所以项目依赖可以自动配置,一键启动项目。本文主要讲SpringBoot实现自动配置的流程。
(个人认为SpringBoot的缺点:很多功能封装的太好了,导致如果想学习,或者解决其中的问题则对技术有了一定的要求。毕竟使用的都是Spring自己封装好的东西,想学习其中的底层和原理就需要一层一层往里翻,每个人的习惯不同,这就导致很多功能没有注释或者被简化甚至有些部分人家直接省略掉,这就给想要学习源码和底层原理的人增添了难度。。。)
入口:@SpringBootApplication
众所周知:启动类的注解:@SpringBootApplication,是个组合注解,其中有三个注解比较关键:
- @SpringBootConfiguration:声明它是个配置类
- @EnableAutoConfiguration:中文翻译是‘启动自动配置’,Springboot自动配置主要就是这个注解实现的!
- @ComponentScan:组件扫描,扫描包下有注解的配置类。
关键:@EnableAutoConfiguration
点进去@EnableAutoConfiguration,发现它还导入一个类:AutoConfigurationImportSelector(自动配置导入选择器),很明显自动配置和它脱不了关系!
核心:AutoConfigurationImportSelector.class
1、AutoConfigurationImportSelector类中有个方法:getAutoConfigurationEntry,该方法中的getCandidateConfigurations就是用来获取配置的。
2、 点进去方法,发现它有个判断配置是否为空的校验,其中异常反馈信息是“No auto configuration classes found in META-INF/spring.factories”(在META-INF/spring.factores中找不到自动配置类),所以自动配置类是在‘META-INF’下的‘spring.factories’!
3、在此处打个断点,然后重启下项目,发下走到此处时配置类已经加载好了,并且都在‘org.springframework.boot.autoconfigure’包下!
4、打开maven依赖,找到‘org.springframework.boot.autoconfigure’包,发现果然存在‘META-INF’文件夹和‘spring.factories’配置文件。
5、打开文件,发现里面有个‘EnableAutoConfiguration’的配置,仔细对比后发现该配置下的类和项目启动类加载的配置类一样。
总结:
SpringBoot自动配置功能就是通过在‘@SpringBootApplication’注解中的子注解@EnableAutoConfiguration’中,导入了一个‘自动配置导入选择器’-AutoConfigurationImportSelector.class,在该类的‘getAutoConfigurationEntry’方法中获取需要自动配置的类,然后加载到Spring环境中。而这些需要自动配置的类配置在‘org.springframework.boot.autoconfigure’包下的‘META-INF’文件夹下的‘spring.factories’配置文件中的‘EnableAutoConfiguration’配置下。