0,参看文章
https://www.cnblogs.com/xiaoxi/p/7999885.html
将自动配置的关键几步以及相应的注解总结如下:
1、@Configuration&与@Bean->基于java代码的bean配置
2、@Conditional->设置自动配置条件依赖
3、@EnableConfigurationProperties与@ConfigurationProperties->读取配置文件转换为bean。
4、@EnableAutoConfiguration、@AutoConfigurationPackage 与@Import->实现bean发现与加载。
1,在applicatio.yml中可以写什么!看如下官方文档
2,
(a)Springboot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration
(b) @EnableAutoConfiguration作用:
-利用EnableAutoConfigurationImportSelector导入容器的一些组件【@Import({EnableAutoConfigurationImportSelector.class})】
- EnableAutoConfigurationImportSelector的父类AutoConfigurationImportSelector的selectImports( )方法会返回一个configurations。即List<String>configurations=this.getCandidateConfigurations(annotationMetadata,attributes);获取候选的配置
--getCandidateConfigurations()方法作用使用SpringFactoriesLoader.loadFactoryNames。而loadFactoryNames( )方法
--先剖析loadFactoryNames(Class<?>factoryClass,ClassLoaderclassLoader)的作用:从类路径下获到资源,就是扫描所有jar类路径下的"META-INF/spring.factories"资源
先将所有的spring.factories的路径urls,然后遍历为properties对象,然后从properties对象获得某些值getProperty(factoryClassName)值封装为result返回。
--再剖析getSpringFactoriesLoaderFactoryClass()的作用:获取EnableAutoConfiguration类名
去看,可知道把下面中EnableAutoConfiguration类名对应的值绿色部分添加到ioc容器中
--总结getCandidateConfigurations(annotationMetadata,attributes);的作用:类路径下的"META-INF/spring.factories" 里面配置的所有EnableAutoConfiguration类名对应的值绿色部分 按需要添加到ioc容器中。每一个XXXAutoConfiguration自动配置类,例如org.springframework.boot.autoconfigure.aop.AopAutoConfiguration 都将成为ioc容器中的一个组件。
(c)以HttpEncodingAutoConfiguration类来剖析自动配置原理
-剖析注解
@Configuration //表示这是一个配置类,像以前给spring编写的配置文件一样,现用于给容器中添加组件
@EnableConfigurationProperties({HttpEncodingProperties.class}) //启动指定类的ConfigurationProperties功能;并把{HttpEncodingProperties.class加到ioc容器中
@ConditionalOnWebApplication //这是Spring的底层@Conditional注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效。 作用判断当前应用是否web应用
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前当前类中是否有CharacterEncodingFilter.class ,它可是springMVC中的解决乱码的拦截器
@ConditionalOnProperty(
prefix="spring.http.encoding",
value={"enabled"},
matchIfMissing=true
)//判断配置文件中是否存在某个配置 这里是spring.http.encoding.enabled 如果不存在,判断也应该成立。即配置文件中不存在spring.http.encoding.enabled,判断也应该成立。
--去看HttpEncodingProperties,应该是从配置文件中的“spring.http.encoding”部分获取指定的值和bean属性
---例如我自己编写的person类通过@ConfigurationProperties()获取指定的值和bean属性
感觉HttpEncodingProperties就是一个和person一样作用的实体类。总结:所有在配置文件中能配置的属性都在XXXProperties类封装着
-继续剖析HttpEncodingAutoConfiguration类如下:
而生成CharacterEncodingFilter的某些值是需要this.properties.中获取
所以我们能配置下面这些属性哦!
-总结:XXXAutoConfiguration类 根据当前不同条件判断,决定这个配置类是否生效。一旦生效,这个配置类就会给容器中添加各种组件(组件属性是从properties类中获取的 ),这些类的每一个属性又是和配置文件绑定的