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

Spring Boot初级概念及自动配置原理

初识Spring Boot


 SpringBoot的概念

Spring Boot 是基于 Spring 框架的快速开发脚手架,旨在简化 Spring 应用的初始搭建和开发过程。它通过约定优于配置的理念,提供开箱即用的默认设置,让开发者只需关注业务逻辑,减少繁琐的配置。

SpringBoot的核心优势

快速启动

  • 内嵌 Tomcat/Jetty 服务器,无需单独部署 WAR 包。
  • 通过 main 方法直接运行,秒级启动应用。

自动配置

  • 根据项目依赖(如 JDBC、Redis、Web)自动配置组件,无需手动编写 XML 或 Java Config。

起步依赖

  • 预置常用依赖包(如 spring-boot-starter-web 包含 Web 开发所需全部依赖),避免版本冲突。

生产就绪特性

  • 集成健康检查(/actuator/health)、指标监控(Metrics)、外部化配置(如 application.properties)等运维功能。

无代码生成 & 零 XML 配置

  • 基于注解和 Java Config 开发,告别传统 XML 配置。

创建你的第一个spring boot项目(快速流程)

创建项目 & 添加依赖

pom.xml:

<!-- Spring Boot 父项目(管理版本) -->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version> 
</parent><!-- Web 开发起步依赖(内嵌 Tomcat + Spring MVC) -->
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // 核心注解:组合了 @Configuration + @EnableAutoConfiguration + @ComponentScan
public class App {public static void main(String[] args) {SpringApplication.run(MyApp.class, args); // 启动应用}
}

编写控制器

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController // = @Controller + @ResponseBody
public class HelloController {@GetMapping("/hello") // 映射 GET 请求到 /hellopublic String sayHello() {return "Hello, Spring Boot!";}
}

REST 控制器,处理 HTTP 请求,启动项目访问Web到http://localhost:8080/hello

这时有人要问了,那如果我想换端口呢?如果我想给这个应用起个名字方便在日志和监控等地方识别呢?   

配置文件(可选)

在resources中创建一个application.properties

自定义配置

server.port=8080 # 修改端口(默认也是8080)
spring.application.name=my-first-boot-app

编写完毕即可参与测试

整个流程为

添加依赖 → 主类注解 → 写Controller → 运行 → 访问接口

无需配置 XML、无需部署服务器,适合快速开发微服务、REST API、后台管理系统等常见场景。


SpringBoot自动配置的原理

那么有人要问了,为什么springboot可以自动配置呢?与python一样,你做的事情越少,底层代码做的事情的越多。

主要场景自动配置核心原理总结

依赖管理机制

        版本仲裁        

通过 spring-boot-starter-parent 统一管理所有依赖版本,避免冲突:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.0</version> <!-- 此处定义全局版本 -->
</parent>

      但是我们仍然能自定义依赖版本,毕竟版本仲裁不一定贴合我们项目本身

自定义版本:在<properties>中覆盖默认版本

(例: ​​​<mysql.version>5.1.6</mysql.version>

  Starter 预定义依赖集

        每个 Starter 封装了特定场景所需的全套依赖(包括依赖的传递)

例如:

  • spring-boot-starter-web:自动包含 Tomcat + Spring MVC + Jackson

  • spring-boot-starter-data-jpa:自动包含 Hibernate + Spring Data JPA

条件注解驱动自动装配

根据环境条件类路径配置属性Bean 是否存在等)动态决定是否启用自动配置,从而让应用更灵活、轻量。

常用注解如下:

  • @ConditionalOnClass:类路径存在指定类时生效
    (例:存在 Servlet.class 才配置 Tomcat)

  • @ConditionalOnMissingBean:容器无该 Bean 时生效
    (例:用户未自定义 DataSource 才注入默认数据源)

  • @ConditionalOnProperty:配置属性匹配时生效
    (例:spring.datasource.url 存在时配置数据源)

应用如下:

@Configuration
@ConditionalOnClass(DataSource.class) // 存在JDBC驱动才生效
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBean // 用户未自定义时生效public DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}
}

配置属性绑定

@ConfigurationProperties 绑定

将配置文件属性映射到 Java Bean:

@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties {private String url;private String username;// Getter/Setter 省略
}

配置文件示例 (application.properties):

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root

此时配置文件中的属性将映射到JavaBean中

自动配置触发流程(原理)

其核心流程共四步:扫文件 → 读配置 → 筛条件 → 装 Bean

扫描AutoConfiguration.imports

Spring Boot 启动时扫描所有 jar 包的

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件

获取所有声明的自动配置类全名(例如 DataSourceAutoConfiguration

        

读取自动配置类

加载并解析这些配置类(例如上面的DataSourceAutoConfiguration

应用条件注解筛选

检查每个配置类上的条件注解(上文提到过),只有当前环境满足所有条件的配置类才会生效

例如:,当 classpath 下有 DataSource.class 且容器中没有 DataSource bean 时,DataSourceAutoConfiguration 才生效(自动配置嘛,配置了就成bean了,有bean就不能配置不然就冲突了)

加载 Bean 并绑定属性

生效的配置类中定义的 @Bean 方法会被执行创建所需的 Bean 实例。这些 Bean 的属性值(如数据库连接参数)自动从 application.properties/yml 绑定


http://www.dtcms.com/a/328757.html

相关文章:

  • 【递归、搜索与回溯算法】综合练习
  • 系统分析师-数据库系统-并发控制数据库安全
  • 使用 UDP 套接字实现客户端 - 服务器通信:完整指南
  • HiSmartPerf使用WIFI方式连接Android机显示当前设备0.0.0.0无法ping通!设备和电脑连接同一网络,将设备保持亮屏重新尝试
  • 【android bluetooth 协议分析 05】【蓝牙连接详解3】【app侧该如何知道蓝牙设备的acl状态】
  • 【KO】Android 面试高频词
  • 从内核数据结构的角度理解socket
  • Android Activity 的对话框(Dialog)样式
  • RxJava 在 Android 中的深入解析:使用、原理与最佳实践
  • 基于Apache Flink的实时数据处理架构设计与高可用性实战经验分享
  • 【cs336学习笔记】[第5课]详解GPU架构,性能优化
  • 深入 Linux 线程:从内核实现到用户态实践,解锁线程创建、同步、调度与性能优化的完整指南
  • iscc2025区域赛wp
  • 服务器通过生成公钥和私钥安全登录
  • Android 在 2020-2025 都做哪些更新?
  • 如何提供对外访问的IP(内网穿透工具)
  • 【Android】ChatRoom App 技术分析
  • OpenAI 回应“ChatGPT 用多了会变傻”
  • Control Center 安卓版:个性化手机控制中心
  • ClickHouse从入门到企业级实战全解析课程简介
  • 1688商品数据抓取:Python爬虫+动态页面解析
  • 基于elk实现分布式日志
  • Windows11 运行IsaacSim GPU Vulkan崩溃
  • 三极管的基极为什么需要下拉电阻
  • Pycharm选好的env有包,但是IDE环境显示无包
  • Excel多级数据结构导入导出工具
  • Nuxt 3 跨域问题完整解决方案(开发 + 生产环境)
  • Appium-移动端自动测试框架详解
  • 【MCP开发】Nodejs+Typescript+pnpm+Studio搭建Mcp服务
  • 【数据可视化-88】航空公司航班数据分析与可视化:Python + pyecharts洞察航空旅行趋势