Spring Boot

发布于 2026-07-30 19:34 更新于 2026-07-30 19:34 1438 字 8 min read ... 访问量

本文介绍了如何使用 Spring Boot 3.3.4 开发第一个 Web 应用,包括项目创建、依赖管理、控制器编写、打包部署等流程。重点讲解了 Spring Boot 的自动配置机制、配置文件格式、多环境配置、开发工具(如 DevTools 和 Lombok)以及拦截器和数据源的整合,强调了版本管理、安全配置和开发实践中的最佳做法。

Spring Boot

image-001
image-001

第一个 Spring Boot 应用

目标是在浏览器访问指定地址时,由服务器返回 Hello World

创建项目并引入依赖

可以通过 Spring Initializr 创建项目。以下示例使用 Spring Boot 3.3.4,因此运行环境至少需要 Java 17

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.3.4</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

编写控制器

@RestController
public class HelloController {
    @GetMapping("/test")
    public String test() {
        return "Hello World";
    }
}

启动项目后访问 http://localhost:8080/test,浏览器将显示 Hello World

打包与部署

配置 Maven 插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

生成可执行 JAR

在项目根目录执行:

mvn clean package

构建成功后,可在 target 目录找到 JAR 文件。

运行项目

java -jar target/项目名称.jar

Spring Boot 的核心机制

父工程与依赖管理

image-002
image-002

spring-boot-starter-parent 提供常用 Maven 配置,并继承 Spring Boot 的依赖管理能力。

image-003
image-003

Spring Boot 会统一管理大量常用依赖的版本。引入已被管理的依赖时,通常不需要单独声明版本,从而降低版本冲突的概率。

Starter 场景启动器

spring-boot-starter-web 是 Web 场景启动器,会引入 Spring MVC、JSON 处理和默认嵌入式服务器等相关依赖。

如果需要把默认的 Tomcat 替换为 Jetty,可以排除 Tomcat 并引入 Jetty:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

启动类与 SpringApplication.run()

@SpringBootApplication
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext =
                SpringApplication.run(SpringBootDemoApplication.class, args);

        System.out.println(applicationContext.getBean(HelloController.class));
    }
}

SpringApplication.run() 会启动 Spring 容器,执行自动配置,并在 Web 项目中启动嵌入式服务器。

@SpringBootApplication

@SpringBootApplication 是组合注解,主要包含以下能力:

  • @SpringBootConfiguration:表明当前类是 Spring Boot 配置类,本质上具有 @Configuration 的作用。
  • @EnableAutoConfiguration:根据类路径中的依赖、已有 Bean 和配置属性进行自动配置。
  • @ComponentScan:默认扫描启动类所在包及其子包。

因此,控制器、业务类、配置类等通常应放在启动类所在包或其子包中。若包结构不满足默认扫描范围,需要显式配置扫描路径。

自动配置

自动配置并不是无条件注册所有 Bean。Spring Boot 会结合依赖、配置属性和容器中已有 Bean 判断某项配置是否生效。

例如,引入 Web Starter 后,Spring Boot 会为 Spring MVC 应用配置 DispatcherServlet、请求映射、消息转换器等组件。开发者自己声明同类型 Bean 时,部分自动配置会按条件退让。

配置文件

Spring Boot 默认支持 application.propertiesapplication.yml。YAML 通过缩进表示层级,缩进必须使用空格,不能使用制表符。

image-004
image-004
person:
  last-name: tom
  age: 20
  married: false
  birth: 1995-03-23
  maps:
    name1: jack
    name2: rose
  friends:
    - zhangsan
    - lisi
  dog:
    name: dog
    age: 2

使用 @ConfigurationProperties

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean married;
    private LocalDate birth;
    private Map<String, String> maps;
    private List<String> friends;
    private Dog dog;

    // getter 和 setter
}

@ConfigurationProperties 适合批量绑定同一前缀下的配置。属性名支持宽松绑定,例如配置中的 last-name 可以绑定到 Java 属性 lastName

对于配置类,也可以配合 @ConfigurationPropertiesScan@EnableConfigurationProperties 注册,而不必在配置对象上添加 @Component

@Value@PropertySource@ImportResource

  • @Value 适合读取少量独立配置。
  • @PropertySource 可加载额外的 .properties 文件,但不直接支持 YAML。
  • @ImportResource 可导入传统 Spring XML 配置。

多环境配置

Spring Boot 使用 Profile 管理不同环境的配置。

多文件方式

application.yml
application-dev.yml
application-test.yml
application-prod.yml

在主配置中激活环境:

spring:
  profiles:
    active: dev

也可以通过启动参数覆盖:

java -jar app.jar --spring.profiles.active=prod

单文件多文档方式

image-005
image-005

YAML 可以使用 --- 分隔多个文档,并通过 spring.config.activate.on-profile 指定对应环境。

spring:
  application:
    name: demo

---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8080

---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 80

开发工具与热部署

引入 DevTools 后,类路径发生变化时可以触发应用重启。它属于开发辅助工具,不应作为生产环境部署方案。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

IDE 还需要开启自动编译或手动触发构建,否则修改后的类文件没有更新,DevTools 也不会重启应用。

Lombok 简化实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean married;
    private LocalDate birth;
    private Map<String, String> maps;
    private List<String> friends;
    private Dog dog;
}

Lombok 会在编译阶段生成常用方法。使用时应安装 IDE 插件并开启注解处理,避免编辑器误报。

配置 Spring MVC 拦截器

编写拦截器

Spring Boot 3 使用 jakarta.servlet 包下的 Servlet API。

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler) {
        System.out.println("preHandle");
        return true;
    }

    @Override
    public void postHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler,
            ModelAndView modelAndView) {
        System.out.println("postHandle");
    }
}

注册拦截器

推荐把拦截器本身注册为 Bean,再通过构造器注入到配置类中。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    private final MyInterceptor myInterceptor;

    public MyMvcConfig(MyInterceptor myInterceptor) {
        this.myInterceptor = myInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/error");
    }
}
@Component
public class MyInterceptor implements HandlerInterceptor {
    // 拦截逻辑
}

整合 Druid 数据源

使用 Spring Boot 3 对应的 Druid Starter 时,不需要再重复引入普通 druid 依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.23</version>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://localhost:3306/java2601?serverTimezone=UTC&characterEncoding=utf8
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver
      max-active: 10
      min-idle: 3
      initial-size: 2
      max-wait: 10000

测试数据源

@SpringBootTest
class SpringBootDemoApplicationTests {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    void testJdbcTemplate() {
        List<Map<String, Object>> list =
                jdbcTemplate.queryForList("SELECT * FROM t_user");

        System.out.println(list);
        System.out.println(jdbcTemplate.getDataSource());
    }
}

数据库账号和密码不应提交到公开仓库。实际项目可通过环境变量、外部配置文件或密钥管理服务提供敏感配置。

喜欢的话,留下你的评论吧~

... 访问量
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka