2 — springboot的原理
1、初步探索:第一个原理:依赖管理



发现:这里面存放着各种jar包 和 版本号
- 这也是:我们在前面第一个springboot项目创建中勾选了那个web,然后springboot就自动帮我们导入很多东西,而且我们不再编写版本号的原因之一,因为springboot仓库中就有
- 以上的这些东西有一个专业的名词:叫依赖管理 —— 就是父项目中已经有了相应的依赖,我们只需要在用的模块中导入需要的依赖就可以了( 即:不用导入版本号,因为:父项目中有版本号 , 如:后续用的web启动器 )
补充:springboot的启动器
spring-boot-starter就是这个玩意儿,指的就是springboot的启动场景,如:我们在第一个springboot项目勾选了web( 要是看了maven的话,就会发现有如下这个jar包 )

这就是一个springboot的启动场景嘛,springboot会帮我们导入web所需要的依赖呗
2、springboot的第二个原理 — 真正的原理:自动装配
建议:老衲把底层中的几个常见注解单独整理出来说明了一下,因此:要是像确切的明白springboot底层中的一些注解的意思是什么,那么:建议看一下我另一篇博客,然后再来看这篇博客后面的内容,另一篇注解解读博客链接如下:
先来看一下主方法有哪些东西

1)、分析@SpringBootApplication,点进去看一下

2)、先看一下
@ComponentScan注解- ComponentScan这个词其实已经见过了,就是在当初ssm整合,springmvc中见过( 扫包 ),就是扫描包

- ComponentScan这个词其实已经见过了,就是在当初ssm整合,springmvc中见过( 扫包 ),就是扫描包
3)、再来看:
@EnableAutoConfiguration——— 自动导入包


- 发现有
@AutoConfigurationPackage和@Import({AutoConfigurationImportSelector.class})- 先看一下:
@AutoConfigurationPackage

这里获取到的就是我们主启动类所在的包路径 也就是第一个springboot程序中说: 建包必须和主启动类同级 / 子集的原因 —— 这里可以采用给
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));这句代码前面debug,然后使用调试工具Evaluate Express,把new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames()输入进去,可以得到结果,就是我们建的包路径
- 先看一下:
接着回来看:@Import({AutoConfigurationImportSelector.class})自动导入包,是怎么导入的?点进AutoConfigurationImportSelector.class看一下 ———— 这才是springboot能够实现自动导入jar包的核心


接着看一下getSpringFactoriesLoaderFactoryClass(),得到的是什么东西

回过来看loadFactoryNames(),把能够自动装配的类对象拿回来做了什么,从而了解更多信息

分析loadSpringFactories()

现在去见一下传说中的META-INF/spring.factories,前面已经多次见到了它了



那么:有一个问题,如下图:判断非空的依据是什么?

用WebMvcAutoConfiguration举例:


因此:总结springboot能够自动装配( 自动帮我们导入相应依赖 )的原因:

结论:
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;
它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;
回到主方法,里面有一个run(),接着看一下

这里面的源码不分析,复杂得很,springboot底层一共有100多万行代码,要入门基本条件就是掌握如下的这些方法

附:SpringApplication.run()的执行原理

自此:初步探索springboot的原理结束
2 — springboot的原理的更多相关文章
- SpringBoot启动原理及相关流程
一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...
- SpringBoot底层原理及分析
一,Spring Boot简介 1.什么是Spring Boot: SpringBoot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特 ...
- SpringBoot启动原理
SpringBoot启动原理 我们开发任何一个Spring Boot项目,都会用到如下的启动类: @SpringBootApplication public class Application { p ...
- springboot启动原理解析
springboot核心原理: 1.基于springmvc无配置文件完全注解化 + 内置web容器实现springboot框架.main函数方式的启动 2.通过maven快速整合第三方框架 sprin ...
- 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)
@ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...
- 带着萌新看springboot源码11(springboot启动原理 源码上)
通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...
- Springboot定时任务原理及如何动态创建定时任务
一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...
- 窥看 SpringBoot 的原理与使用
一:SpringBoot的启动 1. 继承spring-boot-starter-parent项目 2. 导入spring-boot-dependencies项目依赖 二:Spring Boot 主类 ...
- 深度好文,springboot启动原理详细分析
我们开发任何一个Spring Boot项目,都会用到如下的启动类 1 @SpringBootApplication 2 public class Application { 3 public stat ...
随机推荐
- [LGP2758]编辑距离
目录 题目 题目描述 输入格式 输出格式 输入输出样例 题目分析 状态转移方程 初始状态 结束状态 Code 题目 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
- 链表分割 牛客网 程序员面试金典 C++ Python
链表分割 牛客网 程序员面试金典 C++ Python 题目描述 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode* p ...
- Qt 使用大神插件快速创建树状导航栏
前言 本博客仅仅记录自己的采坑过程以及帮助网友避坑,方便以后快速使用自定义控件,避免重复出错. 下载插件 大神 Github Qt 自定义控件项目地址:https://github.com/feiya ...
- PTA 6-1 求采用邻接矩阵作为存储结构的无向图各顶点的度 (6分)
PTA 6-1 求采用邻接矩阵作为存储结构的无向图各顶点的度 (6分) 函数接口定义: 函数接口为: void dgree(MGraph G); G为采用邻接矩阵作为存储结构的有向图 裁判测试程序样例 ...
- 学习JS的第三天
一.逻辑分支(续) 1.三目运算符:条件运算符 a>b?c:d;表达式1?表达式2:表达式3; 根据表达式1执行的结果,来决定执行表达式2还是表达式3 表达式1结果是true执行表达式2,最终返 ...
- MySQL基础语句(MySQL内置函数 )
MySQL 字符串函数 函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT ASCI ...
- UE4中C++编程(一)
一: C++工程和Gameplay框架 GameInstance 它适合放置独立于关卡的信息,比如说显示UI. GameMode 表示游戏玩法, 包含游戏进行的规则和胜利条件等等信息,游戏模式是和关卡 ...
- 菜鸡的Java笔记 第三十 - java 异常的捕获及处理
异常的捕获及处理 1.异常的产生分析以及所带来的影响 2.异常的处理的基本格式 3.异常的处理流程 4.异常的处理模式 5.自定义 ...
- vue.js学习与实战笔记(2)
驼峰式写法时需要注意的问题 学习到组件这一章时,由于没注意到vue中对于camelCased的解释,导致出错了都找不出来,后面发现 在使用驼峰式写法时,在使用模板的时候需要使用kebab-case命名 ...