Spring Boot 自动配置:化繁为简的魔法

在 Java 世界里,Spring 框架以其强大的功能和灵活的设计著称,但繁琐的配置也常常让开发者望而却步。Spring Boot 应运而生,它采用"约定大于配置"的理念,通过自动配置机制,极大地简化了 Spring 应用的开发和部署。

自动配置的奥秘:Spring Boot 的魔法棒

想象一下,你是一位魔术师,想要表演一个精彩的魔术。你不需要每次都从头开始准备道具,而是使用预先配置好的魔法箱。Spring Boot 的自动配置就像这个魔法箱,它预先配置了各种常用的 Spring 功能,开发者只需引入相应的依赖,即可轻松使用。

1. Starter 依赖:开启魔法之门

Spring Boot Starter 是一组便捷的依赖描述符,它们将常用的 Spring 组件打包在一起,例如 spring-boot-starter-web 包含了 Spring MVC、Tomcat 等 Web 开发所需的依赖。此外,还有其他常用的 Starter 依赖:

  • spring-boot-starter-data-jpa:用于 JPA 数据访问。

  • spring-boot-starter-security:用于安全性相关配置。

  • spring-boot-starter-test:用于测试。

当你引入一个 Starter 依赖时,Spring Boot 会自动加载该 Starter 依赖及其传递依赖,并将这些依赖添加到你的应用的类路径中。

2. 条件化配置:按需加载,灵活掌控

Spring Boot 的自动配置是基于条件化的,这意味着只有当满足特定条件时,才会加载相应的配置。例如,只有当你的类路径中存在 spring-webmvc 依赖时,Spring Boot 才会自动配置 Spring MVC。

Spring Boot 使用 @Conditional 注解及其派生注解来实现条件化配置。这些注解可以根据多种条件来决定是否加载配置,例如:

  • @ConditionalOnClass:当类路径中存在指定的类时,才会加载配置。

  • @ConditionalOnMissingBean:当 Spring 容器中不存在指定类型的 Bean 时,才会加载配置。

  • @ConditionalOnProperty:当指定的配置属性存在且值为指定值时,才会加载配置。

例如,以下是一个基于属性的条件配置例子:

@Configuration
@ConditionalOnProperty(name = "myapp.feature.enabled", havingValue = "true")
public class MyFeatureConfig {
    @Bean
    public MyFeatureBean myFeatureBean() {
        // 创建和配置 MyFeatureBean
        return new MyFeatureBean();
    }
}

3. 自动配置类:魔法的源泉

Spring Boot 的自动配置类是定义自动配置规则的地方。这些类通常位于 spring-boot-autoconfigure jar 包中,并使用 @Configuration 注解进行标记。

自动配置类中包含了各种 @Bean 定义,用于创建和配置 Spring Bean。这些 Bean 的创建和配置都依赖于条件化配置,只有当满足特定条件时,才会创建和配置这些 Bean。

一些常见的自动配置类包括:

  • DataSourceAutoConfiguration:数据源配置。

  • SecurityAutoConfiguration:安全配置。

  • WebMvcAutoConfiguration:Spring MVC 配置。

4. 自定义配置:掌控全局,随心所欲

尽管 Spring Boot 提供了丰富的自动配置,但开发者仍然可以自定义配置,覆盖自动配置的行为。

Spring Boot 提供了多种自定义配置的方式,例如:

  • 使用 application.properties 或 application.yml 文件配置属性,例如:

    server.port=8081
    myapp.feature.enabled=true

2. 自动配置 Spring MVC

spring-boot-starter-web 依赖会自动加载 spring-boot-autoconfigure jar 包中的 WebMvcAutoConfiguration 类。该类使用 @ConditionalOnClass 注解,只有当类路径中存在 DispatcherServlet.class 时,才会加载配置。

WebMvcAutoConfiguration 类中包含了大量的 @Bean 定义,用于创建和配置 Spring MVC 相关的 Bean,例如:

  • DispatcherServlet:Spring MVC 的核心 Servlet。

  • ViewResolver:视图解析器,用于解析视图名称。

  • HandlerMapping:处理器映射器,用于将请求映射到相应的处理器。

3. 自定义配置

你可以通过创建自定义的 @Configuration 类,并使用 @Bean 定义覆盖自动配置的 Bean,例如:

@Configuration
public class MyWebConfig {

  @Bean
  public ViewResolver customViewResolver() {
    // 自定义视图解析器
    return new MyViewResolver();
  }
}

另外,你可以在 application.properties 文件中加入自定义配置:

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

这样,你就可以自定义视图的前缀和后缀。

结语

Spring Boot 的自动配置机制是其核心特性之一,它通过 Starter 依赖、条件化配置、自动配置类和自定义配置,极大地简化了 Spring 应用的开发和部署。理解和利用 Spring Boot 的自动配置机制,可以让我们写出更加优雅、高效的代码!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

69. x 的平方根(简单)

69. x 的平方根 1. 题目描述2.详细题解3.代码实现3.1 Python方法一:逐个遍历方法二:二分查找 3.2 Java 1. 题目描述 题目中转:69. x 的平方根 2.详细题解 不能使用系统内置的函数,寻找某个数(假定为x)的…

哈希表(C++实现)

文章目录 写在前面1. 哈希概念2. 哈希冲突3. 哈希函数4.哈希冲突解决4.1 闭散列4.1.1 线性探测4.1.2 采用线性探测的方式解决哈希冲突实现哈希表4.1.3 二次探测 4.2 开散列4.2.2 采用链地址法的方式解决哈希冲突实现哈希表 写在前面 在我们之前实现的所有数据结构中(比如&…

【详解】RV1106移植opencv-mobile库

文章目录 前言一、烧入镜像二、编译项目1.创建项目文件 三、移植四、运行文件五、总结 前言 硬件:瑞芯微Rv1106【Luckfox Pro\Max Pico、网线一根、USB线、串口助手、摄像头 软件:ubuntu 20.4 编译器:arm-rockchip830-linux-uclibcgnueabihf…

昇思25天学习打卡营第6天|网络构建

网络构建 概念模型模型参数 概念 神经网络模型是由神经网络层和Tensor操作构成的,mindspore.nn提供了常见神经网络层的实现,在MindSpore中,Cell类是构建所有网络的基类,也是网络的基本单元。一个神经网络模型表示为一个Cell&…

入选顶会ICML,清华AIR等联合发布蛋白质语言模型ESM-AA,超越传统SOTA

作为细胞内无数生化反应的驱动力,蛋白质在细胞微观世界中扮演着建筑师和工程师的角色,不仅催化着生命活动,更是构筑、维系生物体形态与功能的基础构件。正是蛋白质之间的互动、协同作用,支撑起了生命的宏伟蓝图。 然而&#xff0…

RK3568驱动指南|第十五篇 I2C-第166章 初步认识I2C

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

无线物联网练习题

文章目录 选择填空简答大题 选择 不属于物联网感知技术的是(A) A:ZigBee B:红外传感器 C:FRID D:传感器 ZigBee是一种无线通信技术,虽然它常用于物联网中作为设备之间的通信手段,但它本身并不是一种感知技术 关于物联网于与互联网的区别的描述&#xff…

在线疫苗预约小程序的设计

管理员账户功能包括:系统首页,个人中心,工作人员管理,管理员管理,用户管理,疫苗管理,论坛管理,公告管理 微信端账号功能包括:系统首页,公告,疫苗…

机器人控制系列教程之并联机器人简介

背景 根据其构件的连接是否构成闭环形式,机器人可分为串联机器人和并联机器人两种。对于串联机器人,其所有的构件以串联的结构形式连接起来,在空间组成一种开环结构,因而具有工作空间大,灵活性好等优点,但…

MySQL之高可用性和应用层优化(一)

高可用性 故障转移和故障恢复 在应用中处理故障转移 有时候让应用来处理故障转移会更加简单或者更加灵活。例如,如果应用遇到一个错误,这个错误外部观察者正常情况下是无法察觉的,例如关于数据库损坏的错误日志信息,那么应用可…

C++算法学习心得八.动态规划算法(6)

1.最长递增子序列(300题) 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如&…

Kaggle竞赛——房价预测

目录 1. 特征分析1.1 数据集导入1.2 统计缺失值1.3 可视化缺失值1.4 缺失值相关性分析1.5 训练集和测试集缺失数据对比1.6 统计特征的数据类型1.7 数值型特征分布直方图1.8 数值型特征与房价的线性关系1.9 非数值型特征的分布直方图1.10 非数值型特征箱线图1.11 数值型特征填充…

代码随想录算法训练营第55天(py)| 单调栈 | 42. 接雨水*、84.柱状图中最大的矩形

42. 接雨水* 力扣链接 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 思路1 暴力 按列来计算。每一列雨水的高度,取决于,该列 左侧最高的柱子和右侧最高的柱子中,…

WMS、ERP、MES之间的关系

WMS(仓库管理系统)、ERP(企业资源计划)、MES(制造执行系统)是企业管理和运作中常见的三种系统,它们在不同的层面上发挥作用,但之间又有紧密的联系。三者之间的区别如下: …

【哈哈大一上学的全忘了,重开!!】STM32从零入门物联网开发

本笔记资料来源 :STM32物联网入门30步=单片机物联网入门教程 WIFI连接阿里云物联网CubeMXHAL库蓝牙ESP8266杜洋主讲_哔哩哔哩_bilibili IOT:Internet of things 学习目标: 1.掌握洋桃IoT开发板的各功能以及驱动与基本应用 2.掌…

【C++11:右值引用,列表初始化】

统一列表初始化: 构造函数的函数名与函数体之间增加一个列表,用于对成员初始化 在实例化对象时,支持单/多参数的隐式转化,同时也可以省略符号,让代码更简洁 右值的引用 左值: 左值与右值的重要区别就是能…

tkinter显示图片

tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…

专题五:Spring源码之初始化容器上下文

上一篇我们通过如下一段基础代码作为切入点,最终找到核心的处理是refresh方法,从今天开始正式进入refresh方法的解读。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

2.3章节Python中的数值类型

1.整型数值 2.浮点型数值 3.复数   Python中的数值类型清晰且丰富,主要分为以下几种类型,每种类型都有其特定的用途和特性。 一、整型数值 1.定义:整数类型用于表示整数值,如1、-5、100等。 2.特点: Python 3中的…

面试题-Spring家族与SpringIOC

1.spring家族的介绍 Spring简单图: 2.IOC原理 IOC就是原先代码里需要开发者实现对象的创建和关系依赖,反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 依赖注入的方式: Setter:实现特定属性的public sette…