6.1,SpringBoot自动装配是什么,解决了什么问题:
- **自动装配就是为了实现从Spring。factories文件中获取到对应的bean对象,并且由Spring容器来帮我们进行管理;**- **解决了我们需要手动编写配置注入功能组件等的繁琐工作问题;**
6.2,* SpringBoot实现自动装配的原理:
1. 当执行**main**方法,启动SpringBoot程序的时候,会先创建**SpringApplication类的对象**,在该对象中进行一些参数的初始化工作;最重要的就是判断当前程序的类型以及创建**初始化器Initializers**和**监听器Listener**,在这个过程中程序会调用**loadSpringFactories**方法在“**META-INF/**”目录下加载**spring.factories**文件,并将配置文件放到**缓存**中,方便后续获取;1. 当**SpringApplication对象**初始化完成后,开始执行run方法,来完成整个SpringBoot程序的启动;在启动过程中,最主要有两个方法,一个是**prepareContext**方法,一个是**refreshContext**方法,在这两个关键步骤中完成了自动装配的核心功能;1. 在**prepareContext**方法中,主要完成的是对上下文对象的初始化操作,包括了属性值的设置,比如,系统环境属性等;在整个方法执行过程中,有一个非常重要的**load**方法,该方法主要作用就是将当前启动类当做一个**beanDefinition**注册到**registry**中,方便后续在对**BeanFactoryPostProcessor**调用执行的时候,找到对应的启动类(主类),来完成对**@SpringBootApplication**,**@EnableAutoConfiguration**等注解的解析工作;1. 在**refreshContext**方法中,会对整个容器进行一个刷新的过程,会调用Spring中的**refresh**方法,**refresh**有13个关键方法,来完成整个Spring程序的启动,其中在**自动装配过程**中,会调用其中的**invokeBeanFactoryPostProcessor**方法,该方法主要对**ConfigurationClassPostProcessor**配置增强类进行处理,(这个类既是**BeanFactoryPostProcessor**的子类也是**BeanDefinitionRegistryPostProcessor**的子类,)在进行调用时会先调用**BeanDefinitionRegistryPostProcessor**类中的**postProcessorBeanDefinitionRegistry**方法,然后调用**postProcessorBeanFactory**方法;然后执行在里面的**postProcessorBeanDefinitionRegistry**方法的时候会解析处理各种注解,包含**@ComponentScan,@Bean,@Configuration,@Import**等在启动类上的注解,其中**最重要**的是对**@Import注解**的解析;1. 在解析**@Import**的时候,会有一个**getImport**方法,会从主类开始对注解进行**递归**解析,直到每一层的**@Import注解**都会被解析到,然后在**processImport**方法中对所有**Import对象**进行分类,这里主要是识别**AutoConfigurationImportSelect类对象**,并将该类归属于**ImportSelect**的子类,方便在后续过程中的调用,在**ConfigurationClassParser**类中的**getImport**方法中的**process**方法来完成对**EnableAutoConfiguration类**的加载,并根据初始化的**EnableAutoConfiguration**对象类型(导入的starter启动器及其他依赖)将放在**缓存**中的**spring.factories**文件中与其匹配的键值对(依赖包名)全部加载到SpringBoot中,再对需要的依赖或者启动器进行筛选后,根据名字加载对应的依赖并返回到(**AutoConfigurationImportSelector**)类中进行**实例化**后,放入**Spring容器**中进行管理,就实现了自动装配的整个过程;
