Spirngboot为啥会比Spring使用更简单,少了那么多的Xml文件?一切都是基于SpringBoot的自动装配,当然SpringBoot的自动装配也是一个高频的面试题。
1.@SpringApplication注解的源码分析
在分析源码时,都要问一问为什么SpringBoot能基于自动装配?
这是一个SpringBoot的项目
1.首先来看下SpringBoot的 @SpringBootApplication注解,在@SpringBootApplication注解下有三个注解,分别是 @SpringBootConfiguration,@EnableAutoConfiguration
@ComponentScan
2.查看 @SpringBootConfiguration 底层它其实就是一个 @Configuration注解,学过Spring的都知道 @Configuration 其实就是一个配置类
3.所以不关注这个注解,咱们直接查看 @EnableAutoConfiguration 这个注解
4.直接在进入 @AutoConfigurationPackage 注解下查看 发现又有一个 @Import(AutoConfigurationPackages.Registrar.class)
5.AutoConfigurationPackages 这个类下发现 它调取了getAutoConfigurationEntry()
6.然后这个 getAutoConfigurationEntry() 又调取了getCandidateConfigurations() 这个方法
7.在 getCandidateConfigurations() 这个方法下就2行代码,一行调取了loadFactoryNames() ,另外一个断言判空,但是好像看到一个
META-INF/spring.factories.(spring的发可T锐死)
8.然后咱们看下这个loadFactoryNames()这个方法里做了什么
- 由上图咱们看到是加载了一个META-INF下的 spring.factories 然后循环遍历取元素
这里就咱们看下 spring.factories 是个什么东西。
10 全局搜索咱们发现spring.factories 文件是 spring-boot-autoconfigure下的一个文件
到这里咱们就发现 spring.factories 文件里的信息,它与 POM.xml文件下的 spring-boot-starter-parent 父依赖下加载的启动类maven坐标的包类似
11.然后回到spring.factories文件,咱们随便点击一个类,会发现底层大量的使用了 @Conditional注解,@Conditional注解来判断是否加载了spring-boot-starter-xxx之类的依赖,也就是Starter组件
到这里基本就明白为啥SpringBoot能够自动装配了,下面总结梳理一下
总结:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中。
2.SpringApplication.run分析
由于run方法源码过于繁琐,在这里就引用其他大佬的梳理的图作为了解
run() 方法总结为4个步骤:
1、推断应用的类型是普通的项目还是Web项目
2、查找并加载所有可用初始化器 , 设置到initializers属性中
3、找出所有的应用程序监听器,设置到listeners属性中
4、推断并设置main方法的定义类,找到运行的主类
最后:
关于springboot,谈谈你的理解: springboot 主要分: springboot的自动装配和run()
springboot的自动装配:
SpringBoot通过@EnableAutoConfiguration注解开启自动配置,对spring-boot-autoconfigure的包下的spring.factories文件进行循环扫描,这个文件中包含了可以进行自动配置的类,当满足@Condition注解指定的条件时,便在Starter组件依赖的支持下进行实例化,注册到Spring容器中run():
①判断当前项目是普通项目还是web项目
②推断并设置main方法的定义类,找到运行的主类
③run方法里面有一些监听器,这些监听器是全局存在的,它的作用是获取上下文处理一些bean,所有的bean无论是加载还是生产初始化多存在。