springboot自动配置的原理_SpringBoot自动配置原理

SpringBoot的启动入口就是一个非常简单的run方法,这个run方法会加载一个应用所需要的所有资源和配置,最后启动应用。

0e4a662cc97840e88a0b870936914fb9

通过查看run方法的源码,我们发现,run方法首先启动了一个监听器,然后创建了一个应用上下文ConfigurableApplicationContext,我们知道,context就是用来加载各种bean和环境配置等信息。

99f0b8dfd1ef4c2683d82bb2541f7836

在context的初始化过程中,会调用一个load方法,将我们的启动类当做参数(sources)传进去,这个方法的主要作用就是加载应用所需的各种bean和资源配置。

62c73bb06d084df18047ad8ee802fc54

load方法会创建一个BeanDefinitionLoader,由BeanDefinitionLoader的loader方法来执行具体的加载。

69ed6d9ecbf44678aba1697e255ecae3

BeanDefinitionLoader的load方法根据所传入的不同source类型来选择不同的加载方式,前面说到,这整个过程之中,source里面就只有启动类这一个对象,所以这里就将其强转成Class并加载。

8b993b21e3704e9b952e8494d1910381
470a6511fd7849bb89f52575050a9bc0

加载Class的方法里面调用了一个isComponent(Class> type)方法,这个方法便是用来判断加载的类上有没有注解的,如果有,就要开始解析注解了。

如此一来,启动类上的@SpringBootApplication注解就会被调用,这个注解是实现SpringBoot自动配置功能的关键所在。

查看@SpringBootApplication的源码,我们发现它实际上是@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解的合集。其中@EnableAutoConfiguration是启用自动配置的,并将导入一些自动配置的类定义;@ComponentScan用来加载应用中一些自定义的类。

0ab73925df914241ad63dcd95ebea199

@EnableAutoConfiguration最终会导入一个自动配置的类列表,这些类大多数都处于备用状态。这边是SpringBoot自动配置的秘密,它已经把你可能要用到的东西全都准备好了,一旦你引入了相关的jar包,对应的功能就会被启用,应用启动时,程序就会读取相关的配置信息。程序首先会尝试到配置文件中读取相关的配置信息,如果配置文件中没有,那么就会启用配置的默认值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/394749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django first lesson 环境搭建

pycharm ide集成开发环境 (提高开发效率) 解释器/编译器编辑器调试环境虚拟机连接 设置VirtualBox端口 操作1 操作2 点击号添加,名称为SSH,其中主机端口为物理机的端口,这里设置为1234,子系统端口为虚拟机的…

《Drupal实战》——3.3 使用Views创建列表

3.3 使用Views创建列表 我们接着讲解Views的设置,首先做一个简单的实例。 3.3.1 添加内容类型“站内公告” 添加一个内容类型“站内公告”,属性配置如表3-1所示。 为该内容类型设置Pathauto的模式news/[node:nid],并且我们在这里将节点类型…

c语言函数编正切余切运算,浅谈正切函数与余切函数的应用

九年义务教育三年制初级中学“数学”课本中,对正切函数和余切函数的定义是这样下的:在RtABC中,∠C=90,a&#…

wget命令下载文件

wget -r -N -l -k http://192.168.99.81:8000/solrhome/ 命令格式: wget [参数列表] [目标软件、网页的网址] -V,–version 显示软件版本号然后退出; -h,–help显示软件帮助信息; -e,–executeCOMMAND 执行一个 “.wgetrc”命令 -o,–output…

idea mybatis generator插件_SpringBoot+MyBatis+Druid整合demo

最近自己写了一个SpringBootMybatis(generator)druid的demo1. mybatisgenerator逆向工程生成代码1. pom文件pom文件添加如下内容,引入generator插件org.mybatis.generator mybatis-generator-maven-plugin 1.3.5 mysql …

vr格式视频价格_如何以100美元的价格打造自己的VR耳机

vr格式视频价格by Maxime Coutte马克西姆库特(Maxime Coutte) 如何以100美元的价格打造自己的VR耳机 (How you can build your own VR headset for $100) My name is Maxime Peroumal. I’m 16 and I built my own VR headset with my best friends, Jonas Ceccon and Gabriel…

python_装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值得 有一个参数 万能参数# 装饰器的作用# 原则 :开放封闭原则# 语法糖:装饰函数名# 装饰器的固定模式 import time # time.time() # 获取当前时间 # time.sleep() # 等待 # 装饰带参数的装饰器 def timer…

欧洲的数据中心与美国的数据中心如何区分?

人会想到这意味着,在欧洲和北美的数据中心的设计基本上不会有大的差异。不过,一些小的差异是确实存在的。您可能想知道为什么你需要了解欧洲和北美的数据中心之间的差异,这对你的公司有帮助吗?一个设计团队往往能从另一个设计团队那里学到东…

老农过河

java老农过河问题解决 http://www.52pojie.cn/thread-550328-1-1.html http://bbs.itheima.com/thread-141470-1-1.html http://touch-2011.iteye.com/blog/1104628 转载于:https://www.cnblogs.com/wangjunwei/p/6032602.html

python isalnum函数_探究Python中isalnum()方法的使用

探究Python中isalnum()方法的使用 isalnum()方法检查判断字符串是否包含字母数字字符。 语法 以下是isalnum()方法的语法: str.isa1num() 参数 NA 返回值 如果字符串中的所有字符字母数字和至少有一个字符此方法返回 true,否则返回false。 例子 下面的例…

docker快速入门_Docker标签快速入门

docker快速入门by Shubheksha通过Shubheksha Docker标签快速入门 (A quick introduction to Docker tags) If you’ve worked with Docker even for a little while, I bet you’ve come across tags. They often look like “my_image_name:1” where the part after the col…

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列(LIS)。【题目描述】给定N个数,求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6那么什么是最长上升子序列呢? 就是给你一个序列…

如何快速掌握一门新技术/语言/框架

IT行业中的企业特点是都属于知识密集型企业。这种企业的核心竞争力与员工的知识和技能密切相关。而如果你在企业中扮演的是工程师的角色的话,那么 你的核心竞争力就是IT相关的知识与技能的储备情况。而众所周知,IT行业是一个大量产生新知识的地方&#x…

c语言今天星期几问题,C语言输入今天星期几

满意答案迷茫03222015.07.24采纳率&#xff1a;55% 等级&#xff1a;9已帮助&#xff1a;665人123456789101112131415161718192021#include<stdio.h>int main(void){ enum weekday{ sun, mon, tue, wed, thu, fri, sat }; int n; printf("输入星期数(0-…

备忘录模式 详解

定义 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff1b; 行为型模式 角色 发起人角色&#xff08;Originator&#xff09;&#xff1a;记录当前时刻的内部状态&#xff0c;负责定义哪些属于备份范围的状态&#xf…

dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入

欢迎各位添加微信号&#xff1a;qinchang_198231 加入安全 交流群 和大佬们一起交流安全技术01技术概要这是一种允许攻击者从内存而非磁盘向指定进程注入DLL的技术&#xff0c;该技术比常规的DLL注入更为隐蔽&#xff0c;因为除了不需要磁盘上的实际DLL文件之外&#xff0c;它…

像程序员一样思考_如何像程序员一样思考-解决问题的经验教训

像程序员一样思考by Richard Reis理查德里斯(Richard Reis) 如何像程序员一样思考-解决问题的经验教训 (How to think like a programmer — lessons in problem solving) If you’re interested in programming, you may well have seen this quote before:如果您对编程感兴趣…

CF908G New Year and Original Order 数位DP

传送门 看到数据范围到\(10^{700}\)毫无疑问数位DP。那么我们最重要的问题是如何有效地维护所有数位排序之后的数的值。 对于某一个数\(x\)&#xff0c;设\(f_{x,i} (i \in [1,9])\)表示\(x\)中的所有数位的值\(\geq i\)的数位数量&#xff0c;比如说\(f_{6345982 , 7} 2 , f_…

锐捷亮相GITC:请互联网企业为我点个赞!

【51CTO.com原创稿件】GITC全球互联网技术大会已成功举办四届&#xff0c;今年的会议现场依然是摩肩接踵围观者众。围绕互联网热点技术&#xff0c;众人根据云、大数据、安全、运维、基础架构的不同主题&#xff0c;各自聚成小圈子展开深入交流。 锐捷的展位在主会场的内侧&…

c语言汇编混合编程方法,C语言和汇编语言混合编程方法

摘要&#xff1a; C语言是一种高级的面向过程的开发语言&#xff0c;汇编语言是一种低级的面向机器的编程语言。两者在程序设计开发方面各有优劣&#xff0c;目前两者的混合编程得到了广泛的应用。本文通过具体的实例&#xff0c;说明了混合编程的基本方法&#xff0c;为C语言应…