SpringBoot自动装配原理

1、初步探索:依赖管理

截图

截图

截图

发现:这里面存放着各种jar包 和 版本号

这也是:我们在前面第一个springboot项目创建中勾选了那个web,然后springboot就自动帮我们导入很多东西,而且我们不再编写版本号的原因之一,因为springboot仓库中就有

以上的这些东西有一个专业的名词:叫依赖管理,就是父项目中已经有了相应的依赖,我们只需要在用的模块中导入需要的依赖就可以了(即:不用导入版本号,因为:父项目中有版本号,如:后续用的web启动器)


补充:springboot的启动器

  • spring-boot-starter就是这个玩意儿,指的就是springboot的启动场景,如:我们在第一个springboot项目勾选了web(要是看了maven的话,就会发现有如下这个jar包)

截图

  • 这就是一个springboot的启动场景嘛,springboot会帮我们导入web所需要的依赖呗

2、自动装配

2.1、看主启动类

先来看一下主方法有哪些东西

截图


2.2、分析@SpringBootApplication

点进去看一下

截图


2.2.1、看@ComponentScan

ComponentScan这个词其实已经见过了,就是在当初ssm整合,springmvc中见过( 扫包 ),就是扫描包

截图

是一个自定义注解,外面导入的东西也看得懂了

image


2.2.2、@EnableAutoConfiguration 自动导入包

截图

截图

发现有@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})


2.2.2.1、看@AutoConfigurationPackage

截图

截图

这里获取到的就是我们主启动类所在的包路径 也就是第一个springboot程序中说: 建包必须和主启动类同级/子集的原因

这里可以采用给:


AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));

这句代码前面debug,然后使用调试工具Evaluate Express,把


new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames()

输入进去,可以得到结果,就是我们建的包路径


2.2.2.2、@Import({AutoConfigurationImportSelector.class}) 自动导入包

看看这个自动导入包是怎么导入的?点进AutoConfigurationImportSelector.class看一下。这才是springboot能够实现自动导入jar包的核心

截图

截图


2.2.2.2.1、看getSpringFactoriesLoaderFactoryClass()

看看得到的是什么东西

截图


2.2.2.2.2、看loadFactoryNames()

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

截图


2.2.2.2.2.1、分析loadSpringFactories()

截图


2.2.2.3、见传说中的META-INF/spring.factories

前面已经多次见到了它了

截图

截图

截图

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

截图

WebMvcAutoConfiguration举例:
截图

截图


2.2.3、总结:SpringBoot能够自动装配的原因

image

结论:

  • SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值

  • 将这些值作为自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作

  • 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中

  • 它会给容器中导入非常多的自动配置类(xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 并 配置好这些组件,免去了我们手动编写配置注入功能组件等的工作


2.3、看主启动类中main()

截图

这里面的源码不分析,复杂得很

SpringBoot底层一共有100多万行代码,要入门基本条件就是掌握如下的这些方法

截图


2.4、附:SpringBoot的大概执行原理

SpringApplication.run()的执行原理

截图


posted @ 2021-11-07 23:55  紫邪情  阅读(252)  评论(1编辑  收藏  举报