前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第四章 :springBoot自动配置原理,加载过程

第四章 :springBoot自动配置原理,加载过程

作者头像
全栈程序员站长
发布2022-08-09 15:55:20
8540
发布2022-08-09 15:55:20
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

1,springboot启动时加载住配置类,开启了自动配置功能

点开程序启动要走的第一个注解:

第四章 :springBoot自动配置原理,加载过程
第四章 :springBoot自动配置原理,加载过程

可以看到:

第四章 :springBoot自动配置原理,加载过程
第四章 :springBoot自动配置原理,加载过程

有个:

代码语言:javascript
复制
@EnableAutoConfiguration

这个注解的作用:利用:

代码语言:javascript
复制
@AutoConfigurationImportSelector(扫描器)给容器中导入一些组件,有那些组件呢?

可以把上面的注解一级一级点进去,在AutoConfigurationImportSelector的类中有个下面的方法:

第四章 :springBoot自动配置原理,加载过程
第四章 :springBoot自动配置原理,加载过程

关注这行代码:

代码语言:javascript
复制
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

这是获取候选的配置。点击去这个方法,可以看到下面这行代码:

代码语言:javascript
复制
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());

接着点进去:

第四章 :springBoot自动配置原理,加载过程
第四章 :springBoot自动配置原理,加载过程

这里的:

代码语言:javascript
复制
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");

扫描所以jar包类路径下的

代码语言:javascript
复制
spring.factories文件

把扫描到的这些文件的内容包装成properties对象

从properties中获取到EnableAutoConfiguration.class类对应的值,然后吧他们加到容器中。

总之,将类路径 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到容器中,

spring-boot给我们自动加载的组件都在下面这个jar包中:

第四章 :springBoot自动配置原理,加载过程
第四章 :springBoot自动配置原理,加载过程

这些

代码语言:javascript
复制
autoconfigure都会在启动时加入到容器中供我们使用。

二,以

代码语言:javascript
复制
HttpEncodingAutoConfiguration 类为例,说明自动配置

ctrl+n打开

代码语言:javascript
复制
HttpEncodingAutoConfiguration类:

可以看到如下注解:

代码语言:javascript
复制
@Configuration  //表示这是个配置类,
@EnableConfigurationProperties({HttpProperties.class}) //启动z指定的类。将配置文件中的值和HttpProperties的属性映射起来
@ConditionalOnWebApplication(
    type = Type.SERVLET
)  //spring底层@Condition注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效,//判断是不是web应用
@ConditionalOnClass({CharacterEncodingFilter.class}) //也是个判断型注解,判断当前项目有没有这个类  、、CharacterEncodingFilter:springmvc中乱码过滤器
@ConditionalOnProperty(
    prefix = "spring.http.encoding",
    value = {"enabled"},
    matchIfMissing = true
)//判断型,判断配置文件是否存在某一个配置
public class HttpEncodingAutoConfiguration {

在上面第二行,点开

代码语言:javascript
复制
HttpProperties.class这个类,可以看到:
代码语言:javascript
复制
@ConfigurationProperties( prefix = "spring.http")//从配置文件中获取指定的的值和bean属性,进行绑定
public class HttpProperties {

所有在配置文件中能配置的属性都在**.properties中封装着。配置文件能配置什么就可以参照某个功能对应的这个属性类。

总结:

1,springboot启动会加载大量的自动配置类

2,我们看我们需要的功能有没有springboot默认写好的自动配置类‘

3,我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)

4,给容器中自动配置类添加组件的时候, 会从properties类中的获取某些属性,我们就可以在配置文件中指定这些属性的值

5,自动配置中有很多判断,只有判断返回true才能该容器添加组件,里面的内容才能生效

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105998.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档