学习springboot 的自动配置原理

前言

为什么要学习springboot 的自动配置原理?

1学习 自定义成starter 的前提

  • 实际开发中,我们如果定义公共的组件给团队使用,为了让他们使用方便就自定义成starter。而想要学习starter ,就要先了解springboot 的自动配置原理

2 面试需要

  • 了解自动配置的实现过程

了解 springboot 的自动配置

自动配置的含义

遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器

观点:之前的博客说:程序引入spring-boot-starter-web起步依赖,启动后,会自动往ioc容器中注入DispatcherServlet 对象

demo(案例:验证上面的观点)

  • 注释掉web的起步依赖,发现无法从ioc 容器中获得

验证:当引入web启动依赖,将DispatcherServlet 注入到ioc 容器中的

  • 接下来,通过源码分析,当程序引入spring-boot-starter-web起步依赖,是如何将DispatcherServlet 注入到ioc 容器中的。

起点:启动类的@SpringBootApplication。

  • 按ctril+B 进入该注解的底层往下扒

进入@SpringBootApplication 的内部看到


进入@EableAutoConfiguration 注解

  • 看到import注解,我们指定该注解有两者形式

1 导入配置类

2 导入实现ImportSelect 接口的实现类


进入到 AutoConfigurationImportSelector 类,看到重写的 selectImports方法

我们知道该方法返回的String 数组,存储的是配置文件读取的配置类的权限定类名【类的包名+类名形式


进入 getAutoConfigurationEntry 方法,看到getCandidateConfigurations方法

进入该方法,可以看到 调用 load方法 使用类加载器,实现对.import配置文件的解析

鼠标放在类加载器上【getBeanClassLoader】可以看到加载的是 外部库中autoConfiguration


看到 pom文件的spring boot 核心起步依赖【一般情况下,都会有】

XML 复制代码
<!--        springboot核心的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

点进去,可以看到 spring-boot-autoconfigure 依赖

因此我们可以在外部库中,看到spring-boot-autoconfigure 依赖


进入.import配置文件

**注意:**在.import配置文件中都是自动配置类


ctril+f搜索 DispatcherServleAutoConfiguration,看到 DispatcherServleAutoConfiguration,ctril+b进入

进入 DispatcherServleAutoConfiguration

  • @ConditionalOnClass 注解

样图

看到 @ConditionalOnClass({DispatcherServlet.class})

含义:如果 当前环境下,存在 DispatcherServlet类,自动配置类就会使用本类中dispatcherServlet方法,并通过@Bean 注解,将 DispatcherServlet对象,自动注入到 ioc容器中

  • 使用@Bean 注解,将 DispatcherServlet注入ioc 容器

问题

怎么知道当前环境下,存在 DispatcherServlet类?

:web起步依赖如果存在,则就有DispatcherServlet类

总结:当程序引入spring-boot-starter-web起步依赖,自动将DispatcherServlet 注入到ioc 容器中的


之前我们都是手动书写配置类,现在学习自动配置以后应该做什么改变?

答:

之前 的博客:学习 springboot -Bean 管理(注册条件)-CSDN博客

关于@ConditionalOnClass 注解 的CommonConfig 配置类

我们都是手动提供 配置类和在启动类使用import注解导入配置类,这样很显然是不符合自动配置的

因此如果要实现自动配置,配置类不应该由我们提供,而是谁提供bean 对象,就有谁提供配置类--- 引入的外部 jar 包【依赖】


存储自动配置类的全类名【包名+类名形式】在spring-boot-autoconfigure-3.4.3.jar 的哪一个配置文件下?

答:

由于springboot版本的迭代,最早是在spring.factories 配置文件下

现在是在.import配置文件下

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 解压 文件

3 打开 本地仓库文件 修改jar包的所在路径

  • 我已经修改好了

4 复制上面的命令,打开命令行在确保maven 环境配置好的情况下,运行该命令

  • 把这个jar 包下载到本地仓库
  • 我已经在命令行运行成功

5 打开自己的本地仓库,可以看到 已经下好的jar包

6 打开IDEA 构建springboot 项目,在pom 文件添加已经下载的jar包坐标,最好加载成功

XML 复制代码
<!--common-pojo 依赖-->
        <dependency>
            <groupId>cn.itcast</groupId>
            <artifactId>common-pojo</artifactId>
            <version>2.0</version>
        </dependency>

7 打开外部库,就可以看到 common-pojo-2.0.jar

正文

打开 springboot项目【web起步依赖等】

运行截图如下

发现:没有书写任何的配置类,并且成功打印了jar包中的Province对象信息


下一篇博客介绍:自定义starter

相关推荐
吧啦吧啦吡叭卜16 分钟前
【打卡d5】快速排序 归并排序
java·算法·排序算法
问道飞鱼17 分钟前
【Springboot知识】开发属于自己的中间件健康监测HealthIndicate
spring boot·后端·中间件·healthindicate
大得36921 分钟前
宝塔docker切换存储目录
java·docker·eureka
东阳马生架构1 小时前
Netty基础—4.NIO的使用简介一
java·网络·netty
luckyext2 小时前
Postman用JSON格式数据发送POST请求及注意事项
java·前端·后端·测试工具·c#·json·postman
gaorenyusi2 小时前
PentestGPT 下载
学习·web安全
程序视点2 小时前
Redis集群机制及一个Redis架构演进实例
java·redis·后端
鱼樱前端2 小时前
Navicat17基础使用
java·后端
黑风风2 小时前
深入理解Spring Boot Starter及如何自定义Starter
java·spring boot·后端
px52133442 小时前
Solder leakage problems and improvement strategies in electronics manufacturing
java·前端·数据库·pcb工艺