学习springboot 的自动配置原理
前言为什么要学习springboot 的自动配置原理?
1学习 自定义成starter 的前提
[*]实际开发中,我们如果定义公共的组件给团队使用,为了让他们使用方便就自定义成starter。而想要学习starter ,就要先了解springboot 的自动配置原理
2 面试需要
[*]了解自动配置的实现过程
了解 springboot 的自动配置
自动配置的含义
遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器
观点:之前的博客说:程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet 对象
demo(案例:验证上面的观点)
[*]注释掉web的起步依赖,发现无法从ioc 容器中得到
https://i-blog.csdnimg.cn/direct/909fb6e5bb3e4986b890f8ce86c7002d.png
验证:当引入web启动依赖,将DispatcherServlet 注入到ioc 容器中的
[*]接下来,通过源码分析,当程序引入spring-boot-starter-web起步依赖,是怎样将DispatcherServlet 注入到ioc 容器中的。
起点:启动类的@SpringBootApplication。
[*]按ctril+B 进入该注解的底层往下扒
https://i-blog.csdnimg.cn/direct/626bc3a2671745ec95093735fea22e7a.png
进入@SpringBootApplication 的内部看到
https://i-blog.csdnimg.cn/direct/b0eb0e30b0984c5280128a634ccc337d.png
进入@EableAutoConfiguration 注解
[*]看到import注解,我们指定该注解有两者情势
1 导入配置类
2 导入实现ImportSelect 接口的实现类
https://i-blog.csdnimg.cn/direct/3d32fc80e8ae438b8cfd60c5d906947c.png
进入到 AutoConfigurationImportSelector 类,看到重写的 selectImports方法
我们知道该方法返回的String 数组,存储的是配置文件读取的配置类的权限定类名【类的包名+类名情势】
https://i-blog.csdnimg.cn/direct/c979e89917d54fb58cb857c8991ea97a.png
进入 getAutoConfigurationEntry 方法,看到getCandidateConfigurations方法
https://i-blog.csdnimg.cn/direct/c79e42a6e0a9484682b4ac8ab56dfc81.png
进入该方法,可以看到 调用 load方法 使用类加载器,实现对.import配置文件的解析
鼠标放在类加载器上【getBeanClassLoader】可以看到加载的是 外部库中autoConfiguration
https://i-blog.csdnimg.cn/direct/5f25b0cd7c394afbb02797357271f89d.png
看到 pom文件的spring boot 焦点起步依赖【一样寻常情况下,都会有】
<!-- springboot核心的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency> 点进去,可以看到 spring-boot-autoconfigure 依赖
https://i-blog.csdnimg.cn/direct/d0f94dd1268e469eb389ae871e43e5cc.png
因此我们可以在外部库中,看到spring-boot-autoconfigure 依赖
https://i-blog.csdnimg.cn/direct/b42e98d5ff964f5fa9d86f15a2e23211.png
进入.import配置文件
注意:在.import配置文件中都是自动配置类
ctril+f 搜刮 DispatcherServleAutoConfiguration,看到 DispatcherServleAutoConfiguration,ctril+b 进入
https://i-blog.csdnimg.cn/direct/466201f5b80c408f922602bfb9c57aa6.png
进入 DispatcherServleAutoConfiguration
[*]@ConditionalOnClass 注解
样图
https://i-blog.csdnimg.cn/direct/bbd8d133936149c4b89b6780910572c6.png
看到 @ConditionalOnClass({DispatcherServlet.class})
含义:如果 当前环境下,存在 DispatcherServlet类,自动配置类就会使用本类中dispatcherServlet方法,并通过@Bean 注解,将 DispatcherServlet对象,自动注入到 ioc容器中
https://i-blog.csdnimg.cn/direct/8e4b81a5e9a14eaa85f1154addbdebdd.png
[*]使用@Bean 注解,将 DispatcherServlet注入ioc 容器
https://i-blog.csdnimg.cn/direct/dc48353c713d47a4a6f739b7a62058bc.png
问题
怎么知道当前环境下,存在 DispatcherServlet类?
答:web起步依赖如果存在,则就有DispatcherServlet类
总结:当程序引入spring-boot-starter-web起步依赖,自动将DispatcherServlet 注入到ioc 容器中的
https://i-blog.csdnimg.cn/direct/2a07db2cc86148e1b654c6007cb54c1f.png
之前我们都是手动誊写配置类,如今学习自动配置以后应该做什么改变?
答:
之前 的博客:学习 springboot -Bean 管理(注册条件)-CSDN博客
关于@ConditionalOnClass 注解 的CommonConfig 配置类
https://i-blog.csdnimg.cn/direct/b6be9b8f395f49118ca5732153f73bef.png
我们都是手动提供 配置类和在启动类使用import注解导入配置类,这样很显然是不符合自动配置的
https://i-blog.csdnimg.cn/direct/bcafd96964ef436f9b153700b5fe0a32.png
因此如果要实现自动配置,配置类不应该由我们提供,而是谁提供bean 对象,就有谁提供配置类--- 引入的外部 jar 包【依赖】
https://i-blog.csdnimg.cn/direct/86bb163e4c0046b58ce8e6a2977b8287.png
存储自动配置类的全类名【包名+类名情势】在spring-boot-autoconfigure-3.4.3.jar 的哪一个配置文件下?
答:
由于springboot版本的迭代,最早是在spring.factories 配置文件下
如今是在.import配置文件下
https://i-blog.csdnimg.cn/direct/390d98b12bb744268e642e6c970f8f05.png
demo(案例)
注意:这个案例可以和 学习springboot-Bean管理(Bean 注册,Bean 扫描)_spring boot 扫描注解-CSDN博客
Bean注册的demo(案例)进行对比
目的:在springboot项目引入第三方jar包,打印获取 jar包中的province 对象
项目预备
1 使用黑马教学的第三方jar包:common-pojo-2.0.jar
通过网盘分享的文件:03_自动配置.rar
链接: https://pan.baidu.com/s/1IJqFt-Ma8ZEAqX7HoaJ-jg 提取码: xxfq
2 解压 文件
https://i-blog.csdnimg.cn/direct/40337a806eb04e979cf3a8a8772ef577.png
https://i-blog.csdnimg.cn/direct/073f711ac0ec4e70add18a3cd4360599.png
3 打开 本地仓库文件 修改jar包的所在路径
[*]我已经修改好了
https://i-blog.csdnimg.cn/direct/4ecd78b6364a4a638fd06011e2e8a279.png
4 复制上面的命令,打开命令行在确保maven 环境配置好的情况下,运行该命令
[*]把这个jar 包下载到本地仓库
[*]我已经在命令行运行乐成
5 打开本身的本地仓库,可以看到 已经下好的jar包
https://i-blog.csdnimg.cn/direct/c2f7e29399544be68e20942925cd0f1b.png
6 打开IDEA 构建springboot 项目,在pom 文件添加已经下载的jar包坐标,最好加载乐成
<!--common-pojo 依赖-->
<dependency>
<groupId>cn.itcast</groupId>
<artifactId>common-pojo</artifactId>
<version>2.0</version>
</dependency>7 打开外部库,就可以看到 common-pojo-2.0.jar
https://i-blog.csdnimg.cn/direct/3aefc78caa464bc8a6c3404ebf4bd352.png
正文
打开 springboot项目【web起步依赖等】
运行截图如下
发现:没有誊写任何的配置类,而且乐成打印了jar包中的Province对象信息
https://i-blog.csdnimg.cn/direct/3bdb7783433d40abad621994f66cd45a.png
下一篇博客介绍:自定义starter
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]