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的原理结束

最新文章

  1. ECS Linux 服务器公钥秘钥SSH登录
  2. CSS 兼容解决之hack
  3. java提高篇(十三)-----equals()方法总结
  4. Javascript Function()中的降龙十八掌
  5. BigDecimal.ROUND_HALF_XXX的各种用法
  6. Java 集合 - LinkedList
  7. Android开发艺术探索学习笔记(三)
  8. nginx 状态码整理
  9. ecshop后台admin文件夹任意更改名
  10. contentHorizontalAlignment 属性浅析
  11. for/in 循环遍历对象的属性
  12. ESLint学习小记
  13. tensorflow 使用 5 mnist 数据集, softmax 函数
  14. Coalesce (MS SQL Server)——取指定内容(列)中第一个不为空的值
  15. bzoj 1002
  16. 局外者看 -- 美团 vs 滴滴
  17. input聚焦后光标移动至末尾
  18. HTML5 学习之地理定位
  19. 弱网络模拟测试工具---易测app
  20. HCNP学习笔记之HCNP学习的几种境界

热门文章

  1. 矩阵n次幂的计算
  2. 数据治理之元数据管理的利器——Atlas入门宝典
  3. 文献翻译|Design of True Random Number Generator Based on Multi-stage Feedback Ring Oscillator(基于多级反馈环形振荡器的真随机数发生器设计)
  4. HTML+CSS基础(HTML篇)
  5. c 不同类型的指针
  6. hdu 1069 Monkey and Banana(记忆搜)
  7. 检查redis是否正常运行
  8. Linux基本命令学习-文件基本操作1
  9. crond 任务调度
  10. Vue3+Vue-cli4项目中使用腾讯滑块验证码