SpringBoot源码学习

举报
多米诺的古牌 发表于 2021/07/02 16:35:18 2021/07/02
【摘要】 1.SpringBoot框架简介SpringBoot框架采用约定大于配置的思想对应用程序进行默认配置,减少了大量的配置时间。当需要创建一个新的web应用,通过SpringBoot框架会变得非常容易,而且创建出的web应用不再需要各自繁琐的配置,只需要简单的几个步骤就可以创建出一个 Web应用并且可以根据需求的端口直接启动。SpringBoot框架是如何做到这些的呢?答案是自动装配原理。通过这...

1.SpringBoot框架简介

SpringBoot框架采用约定大于配置的思想对应用程序进行默认配置,减少了大量的配置时间。

当需要创建一个新的web应用,通过SpringBoot框架会变得非常容易,而且创建出的web应用不再需要各自繁琐的配置,只需要简单的几个步骤就可以创建出一个 Web应用并且可以根据需求的端口直接启动。

SpringBoot框架是如何做到这些的呢?

答案是自动装配原理。通过这个神奇的自动装配,SpingBoot框架为我们配置好了一系列我们需要的配置,并且附了默认值,当你需要自定义这些默认值时,只要在application.yml配置文件中进行修改就能达成目的。

2.SpringBoot框架自动装配原理源码探析

首先我们从启动类上面的@SpringBootApplication注解开始探析。

@SpringBootApplication注解是由许多注解组成的,当你一直点进去会发现他其实是spring的一个配置类@Configuration,继续点进去后又会发现@Component注解,原来他将自己注册成了spring的一个组件。

而在@SpringBootApplication注解点进行进行探析的时候我们会看到@EnableAutoConfiguration这个注解,他就是我们说的自动装配注解,通过他我们实现了自动装配和加载默认值等操作。

现在我们继续对@EnableAutoConfiguration进行探析,点进去后我们发现他导入了一个类@Import({AutoConfigurationImportSelector.class})

我们继续点击这个导入的类,从名字看应该导入默认的一些配置,在进入这个类后,我们发现getAutoConfigurationEntry(...)方法,继续点进去发现了一个这样的方法getCandidateConfigurations(...),我们好像看到了一个配置文件,接着一层层点进去验证,我们发现真的是指向这个文件:

META-INF/spring.factories

点进去发现了大量的XXXAutoConfiguration的配置类

然后我们发现,方法中加载这些配置后会将他们封装成一个一个properties文件,点开这些properties文件我们发现了需要默认的配置属性和默认的配置值,至此我们发现原来默认配置和默认值就这样加上了。

while(urls.hasMoreElements()) {
    URL url = (URL)urls.nextElement();
    UrlResource resource = new UrlResource(url);
    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
    Iterator var6 = properties.entrySet().iterator();

但是我们又发现,配置文件中很多自动配置类是没有实现的,继续探索我们可以知道@ConditionalOnXXX这一类注解,结合我们的pom文件中添加的各类启动器和创建项目时选择的配置项等条件,自动判断了哪些应该自动装配哪些不用去加载自动装配。

而XXXProperties绑定application.yml中配置的前缀prefix,给容器中自动配置类添加组件的时候,会获取yml中设置的值,以此改变自动装配类中的默认配置,这样就实现了自动装配设置和默认值设置,并且通过配置文件自定义配置值,以此去改变这些默认配置的值实现个性化的自定义的操作。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。