11.自动配置原理入门-自动配置流程-场景
作者:互联网
简单分析一下场景中的自动配置的流程
就拿springboot-autoconfiguration中的web场景来简单分析
进入web的servlet中的DispatcherServletAutoConfiguration
第一个是优先级不影响自动配置
第二个是是否单例,前端控制器不是单例的,因为是做请求分发的自然不能是单例的,也不影响自动配置
第三个是条件判断 在源码中有标这个的意思,意思就是只有基于 servlet 的 Web 应用程序会匹配。条件成立
第四个是条件判断 是否存在这个类,没用爆红就说明存在
第五个是自动配置在之后,不是条件判断所以不影响
那么这个自动配置就会生效,但是也得看看类中还有没有条件判断
比如在自动配置类中还有一个配置类
没爆红就证明存在,那么这个类就能继续,然后就注册组件
在注册组件的时候也有条件判断的,比如这个
第一个先判断有没有这个类,没爆红就是存在
第二个是容器中没有 MULTIPART_RESOLVER_BEAN_NAME = "multipartResolver"; 没有multipartResolver这个组件 条件成立
意思就是说有multipartResolver组件 就不走这里,没有multipartResolver组件才会走这里
没有multipartResolver会生效 但是在方法中又在取这个 multipartResolver的参数,就说明容器中存在multipartResolver的组件,不然下方返回null了
容器中存在multipartResolver,然后又返回了一个名为multipartResolver的组件,就可以看出从容器中取出的multipartResolver组件名字不对
其实通过里面的注释就可以看出这是一个 如果命名错误,就重新注册了名为multipartResolver的组件
下面的老师的总结:
@Bean @ConditionalOnBean(MultipartResolver.class) //容器中有这个类型组件 @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件 public MultipartResolver multipartResolver(MultipartResolver resolver) { //给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。 //SpringMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范 // Detect if the user has created a MultipartResolver but named it incorrectly return resolver; } 给容器中加入了文件上传解析器;
SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
@Bean @ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter() { }
这个是编码过滤器,就是请求过来之后转换编码,上面整体的意思是 我们自己也可以在自己的配置类中定义bean
比如public class myconfig{
public CharacterEncodingFilter characterEncodingFilter() {
... }
}
总结:
- SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration
- 每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定
- 生效的配置类就会给容器中装配很多组件
- 只要容器中有这些组件,相当于这些功能就有了
- 定制化配置
- 用户直接自己@Bean替换底层的组件
- 用户去看这个组件是获取的配置文件什么值就去修改。
xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties
xxxxProperties里面拿值拿的是默认值,我们在application.properties中写的配置就是重写的
标签:11,容器,multipartResolver,配置,MultipartResolver,自动,组件 来源: https://www.cnblogs.com/dzs894330350/p/16654099.html