**
spring’boot自动配置类底层原理
**
此篇博客主要讲解的我们的applicaiton.yml配置文件怎样关联到我们的自动配置类,同时此篇博客也与上篇博客有关联。
好的接下来,我们进入主题。
以这个自动配置类讲解
首先点进去
**
**
1.@Configuration标注它是一个配置类,里面的 proxyBeanMethods 是标注代理bean的方法
标记了@Configuration 底层会给配置创建cglib动态代理(作用:防止每次调用本类的Bean方法而重新创建对象)
为什么要创建cglib动态代理
举个例子
proxyBeanMethods = false//此时这个配置里面设置为不代理(可以理解为设置Bean为多例的)
那么上图例子中每次调用person()方法就会新new一个对象
2.下一个注解
启用可以在配置类设置属性所有对应的类
就是我们在application.yml中想要设置的属性完全由这些Properties结尾的配置类里面的属性说了算
这里是引用了一个配置类({ServerProperties.class)的属性
接下来看看这个配置类
这个类对应的是application.yml中我们能使用的一些属性
3.
.
接下来看看这三个注解
它们三个底层都有@Condition注解,都是@Condition的衍生注解
三个注解作用都是根据自己设置的条件来判断当前配置类符合不符合他们各自的条件,符合就起作用,反之,不起作用。
@ConditionalOnWebApplication(
type = Type.SERVLET
)//来判断当前web环境是不是servlet环境
@ConditionalOnClass({CharacterEncodingFilter.class})
//当前jar或者类路径必须包含这个类(后面的)@ConditionalOnProperty(
prefix = “server.servlet.encoding”,
value = {“enabled”},
matchIfMissing = true
)
//在spplication.yml中server.servlet.encoding.enabled必须为true才启作用
在此,接上篇博客
getConfigurationClassFilter().filter(configurations)
这个方法是将127个自动配置类进行筛选,筛选是靠filter方法
而这个filter()方法,底层就是根据每个配置类里面的每个Conditional注解来一个一个进行判断看看符不符合条件
有个小功能,在application.yml设置debug=true可以看看哪些配置类生效了,哪些没有生效。
接下来进入这个类里面
插一嘴,在这个方法里面
这个@ConditionalOnMissingBean注解意思是:如果我们的IOC容器当中有这个"CharacterEncodingFilter"
Bean,就不注入,没有才注入。
大家可以回想一下,这个方法的功能类比于我们之前在web.xml里面设置的编码过滤,是不是一样的。
这个bean里面的这一步操作是不是就是设置是什么编码。(什么UTF-8之类的)。
到时候内嵌的tomcat会拿到这个Bean(CharacterEncodingFilter),去起作用。
那接下来看看这个bean是怎样工作的.
这个bean里面的setEncoding()里面的参数,属性值是不是就对应我们在配置文件applicaiton.yml文件里面设置的属性值,
这是由springboot底层会拿到配置文件的值然后传到这个setEncoding()方法里面。
比如说我们在配置文件设置的属性值
底层就会帮我们将设置名字对应的值传进去这个配置类里面,然后产生效果。
到这里本篇博客就完结了
本来其实画了一个流程图,但是截图太模糊了,而且那个文件也上传不了博客。图花了很长时间,很可惜。
有个博客写的很好
http://c.biancheng.net/spring_boot/auto-config.html