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中见过( 扫包 ),就是扫描包
是一个自定义注解,外面导入的东西也看得懂了
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能够自动装配的原因
结论:
-
SpringBoot在启动的时候从类路径下的
META-INF/spring.factories
中获取EnableAutoConfiguration
指定的值 -
将这些值作为自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作
-
整个J2EE的整体解决方案和自动配置都在
springboot-autoconfigure
的jar包中 -
它会给容器中导入非常多的自动配置类(
xxxAutoConfiguration
), 就是给容器中导入这个场景需要的所有组件 并 配置好这些组件,免去了我们手动编写配置注入功能组件等的工作
2.3、看主启动类中main()
这里面的源码不分析,复杂得很
SpringBoot底层一共有100多万行代码,要入门基本条件就是掌握如下的这些方法
2.4、附:SpringBoot的大概执行原理
含SpringApplication.run()
的执行原理