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中见过( 扫包 ),就是扫描包

  • 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的原理的更多相关文章

  1. SpringBoot启动原理及相关流程

    一.springboot启动原理及相关流程概览 springboot是基于spring的新型的轻量级框架,最厉害的地方当属自动配置.那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 二 ...

  2. SpringBoot底层原理及分析

    一,Spring Boot简介 1.什么是Spring Boot: SpringBoot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特 ...

  3. SpringBoot启动原理

    SpringBoot启动原理 我们开发任何一个Spring Boot项目,都会用到如下的启动类: @SpringBootApplication public class Application { p ...

  4. springboot启动原理解析

    springboot核心原理: 1.基于springmvc无配置文件完全注解化 + 内置web容器实现springboot框架.main函数方式的启动 2.通过maven快速整合第三方框架 sprin ...

  5. 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)

    @ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...

  6. 带着萌新看springboot源码11(springboot启动原理 源码上)

    通过前面这么多讲解,springboot原理应该也大概有个轮廓了,一些基本的配置,从客户端url到controller(配置一些要用的组件,servlet三大组件,处理器映射器,拦截器,视图解析器这些 ...

  7. Springboot定时任务原理及如何动态创建定时任务

    一.前言 上周工作遇到了一个需求,同步多个省份销号数据,解绑微信粉丝.分省定时将销号数据放到SFTP服务器上,我需要开发定时任务去解析文件.因为是多省份,服务器.文件名规则.数据规则都不一定,所以要做 ...

  8. 窥看 SpringBoot 的原理与使用

    一:SpringBoot的启动 1. 继承spring-boot-starter-parent项目 2. 导入spring-boot-dependencies项目依赖 二:Spring Boot 主类 ...

  9. 深度好文,springboot启动原理详细分析

    我们开发任何一个Spring Boot项目,都会用到如下的启动类 1 @SpringBootApplication 2 public class Application { 3 public stat ...

随机推荐

  1. 零基础学习Linux必会的60个常用命令

    Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令. ...

  2. 算法:N-gram语法

    一.N-gram介绍 n元语法(英语:N-gram)指文本中连续出现的n个语词.n元语法模型是基于(n - 1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构.这一模型被广泛应 ...

  3. Jquery取值方法汇总

    一.下拉框 1.jquery获取当前选中select的text值 var a = $("#ShareMoneyType").find("option:selected&q ...

  4. Pycharm的安装简介

    Pycharm 1. Pycharm简介 PyCharm是由JetBrains打造的一款Python IDE,VS2010的重构插件Resharper就是出自JetBrains之手.同时支持Googl ...

  5. 为什么Hashtab的大小通常取远离2^n 的素数

    举个栗子 在Hashtab中我们通常 Hash(key) % M 来确定 key 所需要存放的位置 M就是Hashtab的大小,假设下面的两个场景 Hash(key1) = 108 Hash(key2 ...

  6. JavaJDK下载及配置环境变量

    卸载jdk 找到原先安装jdk的位置,直接删除这个文件夹,你们叫什么名字就删哪个,我的叫javajdk. 找到我的电脑,右键属性,然后找到环境变量. 删除系统变量里面的JAVA_HOME变量 再双击击 ...

  7. SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作

    有这么一个业务场景:当用户注册后,发送邮件到其邮箱提示用户进行账号激活,且注册成功的同时需要赠送新人用户体验卡券. 业务有了,那么问题也就来了. What? 问题....问题?我听说你有问题? 来拔刀 ...

  8. js--数组的 Array.of() 和 Array.from() 方法的使用总结

    前言 JavaScript 中数组的本质是一个对象,它存在的 length 属性值随数组元素的长度变化,但是开发中经常会遇到拥有 length 属性和若干索引属性的对象,被称为类数组对象,类数组对象和 ...

  9. C# 两个具有相同属性的类赋值

    最近有遇到两个类之间的赋值问题,两个类的属性几乎都一样的,所以写了个通过反射获取属性的然后赋值的方法,把一个类的属性的值赋值给另一个类. 框架是.net 4.5 public static D Map ...

  10. PAT A1039、A1047——vector常见用法

    vector 常用函数实例 (1)push_back() (2)pop_back() (3)size() (4)clear():清空vector中所有元素 (5)insert():insert(it, ...