1、SpringBoot自动装配机制的原理?

自动装配,简单来说就是自动把第三方组件中的Bean装载到IOC容器里面,不需要我们再去写Bean的相关配置;
在SpringBoot中,SpringBoot应用会标注一个@SpringBootApplication注解这样一个注解,这个注解里面就实现 了自动装配;
@SpringBootApplication这个注解是一个复合注解,主要有三个重要注解:@EnableAutoConfiguration、@Configuration和@ComponentScan,而自动装配主要就是通过@EnableAutoConfiguration这个注解实现的;
自动装配主要依赖这样几步:
1.引入相应starter,启动依赖组件的时候,这个组件里面必须要包含一个@Configuration配置类,在这个配置类里面,通过@Bean注解声明需要装配到IOC容器里面的Bean对象;
2.这个配置类是放在starter下的第三方jar包里面,通过SpringBoot中约定大于配置这样一个理念,去把这个配置类的全路径放在classpath:/META-INF/spring.factories文件里面,这样的话,springboot就可以知道第三方jar包里面这个配置类的位置;(这个步骤主要是用到spring中的SpringFactoryLoader来完成的);
3.SpringBoot拿到所有第三方jar包中声明的所有配置类以后,再通过spring提供的ImportSelector这样一个接口,来实现对这些配置类的动态加载,从而去完成自动装配这样一个动作;
image.png
@EnableAutoConfiguration注解内部实现的关键点有两点:
1.此注解标注了@Import(AutoConfigurationImportSelector.class)注解,AutoConfigurationImportSelector.class实现了ImportSelector接口,重写其方法后,方法的返回值都会被纳入到Spring容器管理;
2.重写了方法后,会调用内部逻辑,其中SpringFactopriesLoader类可以从classpath中搜索所有META-INF/spring.factories配置文件,并返回配置;
image.png

2、如何理解SpringBoot中的约定优于配置?

这个首先从它的使用来说,可以减少开发人员对配置项的维护,从而让开发人员更加聚焦在具体的代码编写上;
然后SpringBoot就是基于这个思想的产物,是一个快速开发spring项目的脚手架;
不同于以前的的spring项目,我们不需要做很多和业务无关的配置项,也就是可以不用写那么多的配置文件;
约定大于配置等体现有很多,比如:starter启动依赖,能够帮我们管理依赖下的jar包版本;如果当前应用依赖了web这样一个jar包,springboot会自动内置tomcat容器不需要单独去部署;springboot的自动装配机制中,通过扫描约定路径下的spring.factories文件去进行识别配置类,从而实现Bean的自动装载;Springboot默认会加载resources目录下的application.peroperties问加或yml文件;

3、SpringBoot项目的启动流程?

简略版1:
首先,new SpringApplication对象,加载ApplicationContextInitializerAPplicationListener接口实例;
然后调用SpringApplication的run()方法;
然后调用createApplicationContext()方法创建上下文对象,同时会注册spring的核心组件类(ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcess等);
调用refreshContext()方法启动Spring容器和内置的servlet容器,并且进行bean的自动装配;
简略版2:
1,首先从程序入口main方法中的SpringApplication.run()方法,这个方法会先new一个SpringApplication对象,然后执行SpringApplication类中的run方法,
2,执行SpringApplication类中的run方法时,会先获取应用监听器SpringApplicationRunListeners,开始监听;(SpringApplicationRunListeners是一个监听者,它用来在整个启动流程中接收不同执行点事件通知,它在springboot的各个生命周期广播相应的时间,调用实际的ApplicationListener类)
3,然后加载SpringBoot的配置环境ConfigurationEnvironment,然后把配置环境加入到监听对象中;
4、然后会加载应用上下文ConfigurationApplicartionContext,当做run方法的返回对象;
5、最后会创建Spring容器,再去实现starter的自动装配和Bean的实例化等工作;