当前位置: 首页 > 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.xdnf.cn/news/1294795.html

相关文章:

  • LeetCode215~ 234题解
  • 【代码随想录day 19】 力扣 450.删除二叉搜索树中的节点
  • PyTorch简介
  • electron进程间通信- 从渲染进程到主进程
  • [量化交易](1获取加密货币的交易数据)
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.13
  • C#自定义日期时间选择器
  • C++中的`auto`与`std::any`:功能、区别与选择建议
  • ResourcelessTransactionManager的作用
  • 嵌入式第二十七天(UI相关技术(framebuffer))
  • 深度学习·ExCEL
  • 基于js和html的点名应用
  • Jenkins一直无法启动,怎么办?
  • C# 反射入门:如何获取 Type 对象?
  • Android平台RTSP播放器选型指南:从开源方案到跨平台低延迟专业SDK
  • 浅层神经网络
  • Mysql——如何做到Redolog崩溃后恢复的
  • 完整源码+技术文档!基于Hadoop+Spark的鲍鱼生理特征大数据分析系统免费分享
  • Linux 软件编程:文件IO、目录IO、时间函数
  • VUE基础笔记
  • JS的学习5
  • 更改webpack默认配置项
  • 单片机启动流程详细介绍
  • 高防CDN和高防IP的各自优势
  • RabbitMQ:Windows版本安装部署
  • STM32H743开发周记问题汇总(串口通讯集中)
  • golang语言和JAVA对比
  • 一条n8n工作流
  • SVN提交服务器拒绝访问的问题
  • Linux 桌面到工作站的“性能炼金术”——开发者效率的 6 个隐形瓶颈与破解方案