@SpringBootApplication底层理解
近期在学习SpringBoot,摸索了很久,结合几位老师的理解将自己对@SpringBootApplication的底层理解记录一下
1. @SpringBootApplication的作用
@SpringBootApplication来标注这是一个springboot的应用,被标注的类是一个主程序,运行SpringApplication.run(App.class, args)方法;传入的类App.class必须是被@SpringBootApplication标注的类。
这里有一个注意点,当@SpringBootApplication标注的类如果直接放在java包下是会爆红的(提示信息:Spring Boot Application in default package less… (Ctrl+F1) Inspection info),网上没有找到相关答案,按照我个人理解是因为@ComponentScan注解的原因,解决方法是将启动类放置到其他包下即可,比如新建com.***包。
2. @SpringBootApplication注解的结构
@SpringBootApplication注解除了四个元注解,还由另外三个注解
@SpringBootConfiguration//SpringBoot配置
@EnableAutoConfiguration//启动自动配置
@ComponentScan()//组件扫描
组成,三个注解顾名思义,各自功能非常明确(学好英语太重要了!!!),其中@SpringBootConfiguration声明这是一个SpringBoot配置类,@ComponentScan注解为扫描哪些包下组件,就不多做赘述,详细讲讲对@EnableAutoConfiguration注解进行学习。
3. @EnableAutoConfiguration注解
@EnableAutoConfiguration注解除四个元注解由下两个注解构成
@AutoConfigurationPackage//自动配置包
@Import({AutoConfigurationImportSelector.class})//
3.1 @AutoConfigurationPackage注解
@AutoConfigurationPackage负责保存标注相关注解的类的所在包路径。使用一个BasePackage类,保存这个路径;然后使用@Import注解将其注入到ioc容器中;这样,便可以在容器中拿到该路径。
3.2 @Import(AutoConfigurationImportSelector.class)注解
首先进入AutoConfigurationImportSelector找到selectImports方法
如上图,再进入getAutoConfigurationEntry方法,在这里我们可以发现最终返回了一个configurations,这个是获取到所有需要配置到文件的配置类,整个方法中也是不停在对此进行修改,然后我们再进入获取到这些配置类集合的方法getCandidateConfigurations进行查看
发现又要进入下一个方法(头晕子)
再进入下一个,发现加载了一个类加载器一个loadSpringFactories(工厂),点进去
可以发现classLoader.getResources(“META-INF/spring.factories”)方法,全局搜索这个类,发现了spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面META-INF/spring.factories
META-INF/spring.factories:SpringBoot已经将所有的组件都已经自动写好,启动时就会进入这个文件中去装配
总结一下
-
SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
-
每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
-
生效的配置类就会给容器中装配很多组件
-
只要容器中有这些组件,相当于这些功能就有了
-
定制化配置
-
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration —> 组件 —> xxxxProperties里面拿值 ----> application.properties
由于时间关系还有表达能力可能不是非常好,简单总结了一下学习源码的过程,有不正之处也请大家多多指教!