自动配置[源码分析] - 自动配置流程
文章目录
我们本篇文章主要看一下我们SpringBoot中的各个自动配置类哪些是按需配置了的, 那些是没有配置的, 然后再来进行一个总结:
我们先来看看AopAutoConfiguration是否自动配置完成了?
我们可以看到其中有很多自动配置类, 最外层就是AopAutoConfiguration配置类, 这个配置类的装配条件是看我们配置文件中是否配置了一个前缀为spring.aop, 名字为auto的属性值, 为true, 如果配置了, 那么我们就装配当前类, 如果没有配置, 那么我们认为也是配置了(matchIfMissing = true)
然后这个类装配之后,
内部的第一个类也是一个配置类, 这个配置类就是没有装配的, 可以看到该类的装配条件是要有Advice.class类(AspectJ包中的), 那么这里我们是没有配置切面功能, 所以是没有这个类的, 那么该类显然就是没有装配的
而内部的第二个配置类是装配成功的
然后我们看一下web场景下的DispatcherServletAutoConfiguration是否完成了自动配置:
可以看到一共两个条件:
- 是否是原生Servlet方式, 我们这里使用的就是原生Servlet方式, 不是响应式
- SpringBoot2中推出了响应式编程
- 是否有DispatcherServlet.class类?
- 这个是有的, 前端控制器是SpringMVC包下的, 这里我们导入了web场景, 所以肯定是有的
@AutoConfigureAfter注解是用来控制配置流程的, 指明是要在ServletWebServerFactoryAutoConfiguration类配置完成之后配置的
所以这个类是会加载配置的, 那么再看这个类内部的一些类是否能配置成功?
这个DispatcherServletConfiguration类是否能装配?
也是有两个条件:
- 第一个@Conditional(DefaultDispatcherServletCondition.class)我们先不看, 后面分析
- 第二个@@ConditionalOnClass(ServletRegistration.class)
- 这个类也是有的
我们可以看到该配置类上还有一个注解@EnableConfigurationProperties, 这个注解就是我们之前讲过的配置绑定注解, 通过这个注解可以将对应的配置文件中的值一一对应绑定到WebMvcProperties类型的对象中, 并且会将该组件放到容器中
- 这种方式在SpringBoot底层中是非常非常多的
我们还可以看到, SpringBoot底层帮我们直接new了一个DispatcherServlet, 并且已经是配置好各个属性值了, 就不需要我们自己配置了, 更不需要最原始的时候SpringMVC阶段使用XML方式配置了
还有底下的这种情况我们也要注意一下:
我们可以看到, 条件装配的条件是, 要有对应类型, 并且要没有对应名字的时候, 就创建一个对应名字的对象返回到容器中
- 那么这里其实就是什么?
- 这里的MultpartResolver其实就是我们的文件上传解析器, 那么我们如果学习过文件上传, 容器中的文件上传解析器名字一定要是multipartResolver, 如果不是会出错, 那么很多人可能不知道, 所以起了其他名字, 这个时候偶我们这里的条件配置的功能就是如果容器中有对应的文件上传解析器组件, 但是没有指定名字的组件, 那么我们就获取到组件中的文件上传解析器对象, 然后然后重新以multipartResolver命名之后添加到容器中
然后我们来看一下HttpEncodingAutoConfiguration是否配置了?
一共三个条件:
- 判断是否是原生的Servlet应用?
- 这里是, 我们不是响应式, 是原生Servlet方式
- 判断是否有CharacterEncodingFilter类?
- 有的, SpringMVC包中的类
- 判断是否设置了server.servlet.encoding的值为enabled, 如果没有配, 也认为是配置了(matchIfMissing = true)
然后我们判断该配置类的一些内部的配置类是否配置了?
这里可以看到, 条件是容器中没有该组件的时候就配置
这里其实就体现出一个SpringBoot底层的设计模式: SpringBoot默认会在底层装配好所有的组件, 但是如果用户配置了, 那么以用户配置的优先
总结:
- SpringBoot先加载所有的自动配置类(xxxxAutoConfiguration)
- 每个自动配置类按照条件进行生效, 默认都会绑定配置文件制定的值, 那么如果我们要修改该组件的某个属性值时通过修改配置文件即可完成
- 生效的配置类会给容器中装配很多组价
- 只要容器中有这些组件, 相当于这些功能就有了
- 定制化配置:
- 用户可以使用@Bean替换底层的组价
- 用户去看这个组件是获取的配置文件什么值就去修改配置文件中对应属性值即可.