SpringBoot的自动配置核心原理及拓展点

Spring Boot 的核心原理几个关键点

  1. 约定优于配置

    • Spring Boot 遵循约定优于配置的理念,通过预定义的约定,大大简化了 Spring 应用程序的配置和部署。例如,它自动配置了许多常见的开发任务(如数据库连接、Web 服务器配置等),使得开发人员可以专注于业务逻辑而不是繁琐的配置。
  2. 自动配置

    • Spring Boot 的自动配置(Auto-Configuration)机制是其核心功能之一。它通过在类路径下的 META-INF/spring.factories 文件中定义的配置类,根据应用程序的依赖关系和条件自动配置 Spring 环境。这样可以避免手动配置大量的 Spring 组件和 bean,显著简化了项目的初始化和配置过程。
  3. 起步依赖

    • Spring Boot 提供了大量的起步依赖(Starter Dependencies),它们是预配置的依赖项集合,可以快速地集成常见的技术栈(如Web 开发、数据访问、安全性等)。起步依赖不仅包含了必要的依赖库,还包含了相应的自动配置,使得整合第三方库变得简单和快速。
  4. 内嵌容器

    • Spring Boot 默认集成了多种内嵌的 Web 容器(如Tomcat、Jetty、Undertow),可以直接打包为可执行的 JAR 文件。这种方式简化了部署和运行 Spring 应用程序的过程,不需要额外部署外部的 Web 服务器。
  5. Actuator

    • Spring Boot Actuator 是一个用于监控和管理应用程序的功能模块,可以通过 HTTP、JMX 等多种方式暴露应用程序的内部信息和健康状况。Actuator 提供了许多内置的端点(Endpoints),例如 /actuator/health/actuator/info 等,用于查看应用程序的运行状态和详细信息。
  6. 外部化配置

    • Spring Boot 支持通过外部配置文件(如 application.properties 或 application.yml)来管理应用程序的配置。这些配置文件可以包含不同环境(如开发、测试、生产)的配置选项,允许在不同环境中灵活地切换配置项而无需修改代码。
  7. 注解驱动

    • Spring Boot 鼓励使用注解驱动的开发方式,例如 @SpringBootApplication@RestController@Service 等。这些注解简化了开发人员对 Spring 组件的声明和管理,提高了代码的可读性和维护性。
  8. 外部插件和扩展

    • Spring Boot 支持许多外部插件和扩展,如 Spring Boot DevTools、Spring Boot CLI 等,这些工具和插件进一步增强了开发体验和生产效率。

总体来说,Spring Boot 的设计理念是通过简化配置、提供默认值、自动化任务等手段,使得开发者可以更加专注于业务逻辑的实现,同时显著降低了构建和部署 Spring 应用程序的复杂性和成本。

自动配置原理及自定义自动配置类

原理分析

从@SpringBootApplication 开始

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations

org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories

spring-boot 默认集成的自动配置类

注解@EnableAutoConfiguration是开启springboot开启自动配置的核心。详细流程如下

  1. 具体有@Import({AutoConfigurationImportSelector.class})实现批量导入配置组件容器的功能。
  2. 导入AutoConfigurationImportSelector的对象的selectImports方法返回的所有配置组件。

从spring-boot-autoconfig包中的Autoconfiguration.imports文件中读取需要加载的配置文件。但并不是所有配置都会生效,因为在所有的配置类上都有@ConditionalOnClass注解。当引入starter后,与之对应的@ConditionalOnClass就满足条件了,也就是相关的配置就生效了。

自动配置需要满足的条件,比如:

自定义自动配置类

src/main/resources/META-INF/spring.factories文件中添加自动配置类的引用:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.CustomAutoConfiguration

Spring Boot的启动器监听器

Spring Boot的启动器监听器(ApplicationRunner和CommandLineRunner)允许我们在应用程序启动后执行一些自定义逻辑。我们可以创建自己的启动器监听器来执行特定的初始化或后续操作。

选择使用 CommandLineRunner 还是 ApplicationRunner 取决于你需要处理的命令行参数的复杂性和类型。通常情况下,如果只需要简单地获取和打印命令行参数,可以选择 CommandLineRunner;如果需要更复杂的参数解析或处理逻辑,推荐使用 ApplicationRunner

ApplicationRunner

  • ApplicationRunner 接口中的 run 方法接收一个 ApplicationArguments 对象作为参数,这个对象提供了更丰富的功能来处理应用程序启动时的参数。
  • ApplicationArguments 对象不仅包含了原始的命令行参数数组,还提供了方便的方法来访问和解析命令行参数,包括非标记参数、选项参数等。
  • 适合处理复杂的命令行输入或需要更高级参数解析功能的初始化逻辑。

CommandLineRunner

  • CommandLineRunner 接口中的 run 方法接收一个字符串数组作为参数,这个数组表示应用程序启动时传递的命令行参数。
  • 使用 CommandLineRunner 接口时,你可以直接访问原始的命令行参数数组,可以方便地处理简单的命令行参数,不需要进行复杂的解析。
  • 适合处理基本的命令行输入或简单的初始化逻辑。

参考资料:

https://zhuanlan.zhihu.com/p/653791243

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过Python脚本实现字符画

效果 讲解: 用于将3D视图的帧缓冲区转换为字符画,并将字符画输出到文本编辑器中。 首先,获取当前绑定的帧缓冲区、视口信息和视图像素。 然后,将像素矩阵转化为字符串,并将字符串写入到文本编辑器中。 设置文本编辑…

bmob Harmony快速开发手机号一键登录功能

最近用Bmob的鸿蒙SDK尝试了Harmony开发,做了一个几乎每个应用都会有的功能:手机号码短信验证码一键注册登录的功能,感觉简直爽的不要不要的,ArkUI可见即可得的UI交互设计体验,配合Bmob后端云一如既往简单易用的风格&am…

使用Perplexity打造产品的27种方式

ChatGPT和Perplexity等聊天机器人正迅速成为产品经理的首选助手。以下是一份全面的指南,介绍PM如何在日常工作中使用Perplexity,该指南基于300多份回复和30次电话后的总结。 理解并制定增长战略:例如,解释增长会计的基本原理&…

【Vue】——组件之间数据的传递

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

【proteus经典实战】16X192点阵程序

一、简介 6X192点阵程序通常用于表示高分辨率图像或文字,其中16X表示像素阵列的宽度,192表示每个像素阵列中的点阵数,16X192点阵程序需要一定的编程知识和技能才能编写和调试,同时还需要考虑硬件设备的兼容性和性能等因素。 初始…

知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(子查询)

欢迎来到一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426qq.com 。发布文章的风格因专栏而异,均自成体系,不足…

网线直连电脑可以上网,网线连tplink路由器上不了网

家里wifi网络连不上好几天了,用网线直连电脑可以上网,但网线连tplink路由器wan口上不了网,无Internet连接,网线连lan口可以电脑上网,手机上不了。 后来发现网线的主路由用的192.168.0.1,我的路由器wan口自…

R包的4种安装方式及常见问题解决方法

R包的4种安装方式及常见问题解决方法 R包的四种安装方式1. install.packages()2. 从Bioconductor安装3. 从本地源码安装4. 从github安装 常见问题的解决1. 版本问题2. 网络/镜像问题3.缺少Rtools R包的四种安装方式 1. install.packages() 对于R自带的包的安装一般都可以通过…

共模和差模的基本概念

电压电流在导体或导线中传播时,存在两种工作形态:共模和差模。电子设备的信号线在进行相互通信时,至少会存在两根导线以形成电传输回路,除此之外,通常还存在第三个导体,即“参考地”。当信号正常传输时&…

c++类成员指针用法

1)C入门级小知识,分享给将要学习或者正在学习C开发的同学。 2)内容属于原创,若转载,请说明出处。 3)提供相关问题有偿答疑和支持。 c中新增类成员指针操作,为了访问方便,他是指…

Meven

目录 1.简介2.Maven项目目录结构2.1 约定目录结构的意义2.2 约定大于配置 3. POM.XML介绍3.2 依赖引用3.3 属性管理 4 Maven生命周期4.1 经常遇到的生命周期4.1 全部生命周期 5.依赖范围(Scope)6. 依赖传递6.1 依赖冲突6.2 解决依赖冲突6.2.1 最近依赖者…

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

地图初始化-多视图几何基础

在ORB-SLAM2中初始化和使用的传感器类型有关,其中单目相机模式初始化相对复杂,需要运行一段时间才能成功初始化。而双目相机、 RGB-D相机模式下比较简单,一般从第一帧开始就可以完成初始化。 为什么不同传感器类型初始化差别这么大呢&#x…

spring-security安全框架(超精细版附带流程讲解图)

目录 一、回顾一下 二、security使用 2.1 覆盖掉默认配置「自定义配置」 2.2 如何自定义认证 2.3 纯纯自定义 2.4 jwt 2.5 官网认证流程 2.6 RBAC模型 4.1. 创建表结构 2.7 如何实现权限流程 一、回顾一下 security干啥的? 认证和授权 使用方式 引入依赖, 基于spri…

算法力扣刷题 二十五【28.找出字符串中第一个匹配项的下标】

前言 字符串篇,继续。 记录 二十五【28.找出字符串中第一个匹配项的下标】 一、题目阅读 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不…

C语言中的基础指针操作

在C语言中,指针是一个非常重要的概念,它提供了直接访问内存地址的能力。指针变量用于存储内存地址,而不是数据值,在某种意义上和门牌号具有相似含义:指针是一个变量,其存储的是另一个变量的内存地址&#x…

java之动态代理

1 代理模式 代理模式提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。简言之,代理模式就是设置一个中间代理来控制访问原目标…

网络io与select,poll,epoll

前言 网络 IO,会涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,另一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 1. 等待数据准备就绪 2. 将数据从内核拷贝到进程或…

网络编程常见问题

1、TCP状态迁移图 2、TCP三次握手过程 2.1、握手流程 1、TCP服务器进程先创建传输控制块TCB,时刻准备接受客户进程的连接请求,此时服务器就进入了LISTEN(监听)状态; 2、TCP客户进程也是先创建传输控制块TCB&#xff…

改进经验模态分解方法-通过迭代方式(IMF振幅加权频率,Python)

一种新颖的改进经验模态分解方法-通过迭代方式(IMF振幅加权频率)有效缓解了模态混叠缺陷,以后慢慢讲,先占坑。 import numpy as np import matplotlib.pyplot as plt import os import seaborn as sns from scipy import stats i…