当前位置: 首页 > news >正文

SpringBoot -- 自动配置原理

SpringBoot 自动配置原理

基础知识

Bean扫描

我们在学习 Spring 的时候,如果要把标注一下注解的类扫描进 IOC 容器 @Controller,@Service,@Mapper,是需要通过一下两种方式实现的,但是我们在 SpringBoot 工程中并没有编写有关这个的代码啊?

在这里插入图片描述

  • 其实这部分代码是存在的,只是 SpringBoot 已经帮我们写好了,只要遵循相关约定就能实现 Bean 扫描功能,我们可以点开主启动类上面的注解 @SpringBootApplication

Bean注册

我们之前 Spring 学过使用一下注解可以将自己写的 Bean (Controller) 注册道 IOC 容器内。但是对于第三方Jar 包上(只读文件,不能在他上面添加注解)的 Bean 我们如何注册呢 ? 一共有两种方式:通过@Bean 注解,@Import 注解

在这里插入图片描述

  • 通过 @Bean 注解

该注解可以把方法的返回值,作为 Bean 对象注册进 IOC 容器中,我下面用 SpringBoot 这个 Swagger 的配置类注入并来演示(不懂 Swagger3 没关系)

在这里插入图片描述

  • @Import 注解

我们上面演示的是 @configuration 注解在启动类所在的包下,如果不在呢?这是我们可以使用 @Import 注解,直接将它导入进来。我们一般将他用来导入 配置类,ImportSelector 接口的实现类
在这里插入图片描述

我们观察上面的导入,有没有发现一个问题。就是假如我需要导入的配置类有很多,那么全写在这里面后,代码是不是会显得很臃肿,测试就要用到 ImportSelector 了。

编写 ImportSelector 接口实现类

在这里插入图片描述
在这里插入图片描述

修改启动类的导入代码

在这里插入图片描述

进一步优化

上面配置类存放数组内容是写死的,提高了代码的耦合性,我们可以把这些内容单独放进配置文件类,然后利用输入流逐条获取出来放进数组

在这里插入图片描述

注册条件

当我们注入 Bean 的时候,如果满足某种条件时我们才注入不然就不注入,这些内容会在自定义 Starter 时和查看 SpringBoot 源码时会看到关于这个一共有三个注解可以实现如下

在这里插入图片描述

@ConditionalOnProperty 注解介绍

在这里插入图片描述

在这里插入图片描述

@ConditionalOnMissingBean 注解介绍

在这里插入图片描述

@ConditionOnClass 注解介绍

在这里插入图片描述

自动配置原理

源码解析

在这里插入图片描述

面试该如何回答
  • 在主启动类上添加了 @SpringBootApplication 注解,该注解组合 @EnableAutoConfiguration 注解,而这个注解又组合了 @Import 注解,导入了 AutoConfigurationImportSelector.class 类,
  • 该类实现了 selectImports 方法,这个方法经过层层调用,最终会读取 META-INF 目录下的后缀名为 imports 的文件(配置文件,里面存放很多配置类的全类名)
  • 读取到该文件下的全类名后,会先解析注册条件(@Conditional 及其衍生注解),把满足条件的 Bean 对象注册到 IOC 容器中
    在这里插入图片描述
http://www.dtcms.com/a/263561.html

相关文章:

  • Bessel位势方程求解步骤
  • STL简介+string模拟实现
  • 「Java案例」计算矩形面积
  • 大数据(3)-Hive
  • 【算法】动态规划:1137. 第 N 个泰波那契数
  • 初等变换 线性代数
  • C++ STL之string类
  • Windows11系统中安装docker并配置docker镜像到pycharm中
  • EA自动交易完全指南:从策略设计到实盘部署
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • Android Telephony 网络状态中的 NAS 信息
  • 反射,枚举和lambda表达式
  • 《垒球百科》老年俱乐部有哪些项目·垒球1号位
  • 从零到一通过Web技术开发一个五子棋
  • 【MySQL基础】MySQL索引全面解析:从原理到实践
  • 人形机器人_双足行走动力学:MIT机器人跌落自恢复算法及应用
  • 使用Verilog设计模块输出中位数,尽可能较少资源使用
  • 本周股指想法
  • 产品背景知识——API、SDK、Library、Framework、Protocol
  • 10.【C语言学习笔记】指针(二)
  • Python 数据分析与机器学习入门 (八):用 Scikit-Learn 跑通第一个机器学习模型
  • stm32达到什么程度叫精通?
  • 百度文心大模型4.5系列正式开源,开源会给百度带来什么?
  • docker-compose部署Nacos、Seata、MySQL
  • API接口安全-1:身份认证之传统Token VS JWT
  • 【甲方安全建设】SDL基线建设及审计评估
  • 从设计到开发一个小程序页面
  • JavaScript异步编程的五种方式
  • RocketMQ第五节(springboot整合MQ)
  • C语言main函数的原理:程序入口的奥秘