这里用的springboot 1.5.9.RELEASE
原理
启动时加载主配置类,开启自动配置功能@EnableAutoConfiguration
@EnableAutoConfiguration的作用:
利用EnableAutoConfigurationImportSelector给容器导入一些组件
点进去看他类,再点到它的父类
selectImports方法,可看到最关键的一句
点进getCandidateConfigurations这个方法里,SpringFactoriesLoader.loadFactoryNames。
再点进loadFactoryNames这个方法里,点进这个FACTORIES_RESOURCE_LOCATION
可以看到他的资源,扫描所有jar包类路径META-INF/spring.factories。
在这个路径下往下找,有个 loadFactoryNames 方法。找到所有的资源文件,遍历包装成Properties对象
之后把Properties 转换成list添加到result这个list里
那么问题来了,factoryClassName哪里来的,是由上一步传过来的class,我们去上一步看看
回到AutoConfigurationImportSelector类
点进他,找到 EnableAutoConfiguration.class
去找jar包,就可以发现这个EnableAutoConfiguration的值
由以上可知,每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置
以其中一个来解释自动配置原理HttpEncodingAutoConfiguration。连续按两下Shift键,然后搜索这个类。看下图可以发现,各种条件判断完,就可以决定是否生效
下面这图对应的就是上图的第二行
这个类下有个这个,@Bean给容器中添加一个组件,这个组件的某些值需要从properties属性中获取
然后依据之前的注解
最后就可以按照spring.http.encoding这个在application里配置了