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:

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>

启动类

java 复制代码
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); // 启动应用
    }
}

编写控制器

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController // = @Controller + @ResponseBody
public class HelloController {

    @GetMapping("/hello") // 映射 GET 请求到 /hello
    public String sayHello() {
        return "Hello, Spring Boot!";
    }
}

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

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

配置文件(可选)

在resources中创建一个application.properties

自定义配置

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

编写完毕即可参与测试

整个流程为

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

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


SpringBoot自动配置的原理

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

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

依赖管理机制

版本仲裁

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

java 复制代码
<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 存在时配置数据源)

应用如下:

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

配置属性绑定

@ConfigurationProperties 绑定

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

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

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

java 复制代码
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 绑定


相关推荐
暴躁老砚15 小时前
Windows-MCP.Net本地调试指北
后端
超级大只老咪15 小时前
蓝桥杯知识点大纲(JavaC组)
java·算法·蓝桥杯
Yiii_x15 小时前
如何使用IntelliJ IDEA进行Java编程
java·课程设计·ai编程
JavaGuide16 小时前
招银网络校招开奖了(附后端面经详解)
后端·求职
阿杰AJie16 小时前
如何在程序中避免出现大量if和case
java·后端
sheji341616 小时前
【开题答辩全过程】以 基于Asp.Net网上图书店的设计与实现为例,包含答辩的问题和答案
后端·asp.net
非凡ghost16 小时前
ToDoList(开源待办事项列表) 中文绿色版
前端·javascript·后端
摇滚侠16 小时前
Spring Boot3零基础教程,云服务停机不收费,笔记71
java·spring boot·笔记
用户61204149221316 小时前
html+layui+node+js做的个人财务管理系统
javascript·后端
摇滚侠16 小时前
Spring Boot3零基础教程,监听 Kafka 消息,笔记78
spring boot·笔记·kafka