其他分享
首页 > 其他分享> > 11.自动配置原理入门-自动配置流程-场景

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() {
    ... }

}

总结:

xxxxxAutoConfiguration ---> 组件 ---> xxxxProperties里面拿值 ----> application.properties

 xxxxProperties里面拿值拿的是默认值,我们在application.properties中写的配置就是重写的

 

标签:11,容器,multipartResolver,配置,MultipartResolver,自动,组件
来源: https://www.cnblogs.com/dzs894330350/p/16654099.html