自动装配原理:
1):springboot启动时加载主配置类,其中@EnableAutoConfiguration开启自动装配功能
2):@EnableAutoConfiguration作用:

1>:利用@Import导入了 AutoConfigurationImportSelector.class类,使用这个类给容器导入装配的组件;
2>:其中的selectImports方法的内容:
List configurations =this.getCandidateConfigurations(annotationMetadata, attributes); 获取候选配置
loadFactoryNames方法中扫描所有jar包的路径

把扫描到的文件内容包装成propertier对象 --我们配置的配置文件内容最后也会成功propertier对象
从properties中获取到所有EnableAutoConfiguration.class类(对应得值),然后把他们加载到容器中


将类路径 :META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中:
3):每一个自动配置类的功能
4):以HttpEncodingAutoConfiguration为例解释自动配置原理:

--@Configuration : 表示这是一个配置类,以前编写的配置文件一个样,给容器中添加组件
-- @EnableConfigurationProperties :启动指定类的configurationProperties功能;将配置文件中对应得值与ServerProperties绑定起来;
--@ConditionalOnWebApplication : spring底层@Conditional注解,根据不同的条件,如果满足指定的条件。整个配置类里面的配置生效;判断应用是否web应用,如果是当前配置类生效
-- @ConditionalOnClass : 判断当前项目有没有这个类 CharacterEncodingFilter.class是springMvc中乱码过滤器
--@ConditionalOnProperty : 判断配置文件中是否存在某个配置prefix ="server.servlet.encoding",, 不存在则enabled,默认存在
太踏马帅了~~~~~~~~~~

--@Bean : 给容器添加一个组件 ; 其中this.properies。get值表示某些之需要从properies文件中获取
private final Encoding properties; 表示 this.properies已经和properies文件映射了
重写构造方法,properies中参数的值从容器中获取
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
根据当前不同的条件判断,决定这个配置类是否生效?
5):配置文件中能配置的属性都是对应XXXXproperies的封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
精髓:
1):SpringBoot启动会加载大量的自动配置类
2):我们看我们需要的功能有没有SpringBoot默认写的自动配置类;
3):我们在来看这个自动配置类中到底配置那些组件;(只要我们要用的组件有,我们就不要再来配置了
4):给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
xxxAutoConfiguration:自动配置类; 给容器中添加组件
xxxxProperties :封装配置文件中的相关属性;