跳转至

基础知识#

约 1675 个字 74 行代码 11 张图片 预计阅读时间 36 分钟

功能概述#

  • 创建独立的 Spring 应用程序
  • 直接嵌入 Tomcat、Jetty 或 Undertow(无需部署 WAR 文件)
  • 提供预配置的 "starter" 依赖项,以简化构建配置
  • 在可能的情况下,自动配置 Spring 和第三方库
  • 提供生产就绪的功能,如指标、健康检查和外部化配置
  • 绝不进行代码生成,也不需要 XML 配置

入门案例#

Maven方式#

  • 创建Maven项目
  • pom.xml继承spring-boot-starter-parent父项目,并引入相关依赖,配置打包插件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.luguosong</groupId>
    <artifactId>springboot-hello</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <!--继承父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.3</version>
    </parent>

    <dependencies>
        <!--引入web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--SpringBoot项目打包-->
            <!--包含Spring Boot的运行环境,比如Tomcat-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • 创建Spring Boot配置文件
application.yml
server:
  port: 8888
  • 编写项目入口程序:
SpringBootHelloApplication.java
package com.luguosong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Spring Boot启动类
 *
 * @author luguosong
 */
@SpringBootApplication
public class SpringBootHelloApplication {
    /*
     * Spring Boot启动代码
     * */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloApplication.class, args);
    }
}
  • 编写Controller:
HelloController.java
package com.luguosong.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author luguosong
 */
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello Spring Boot";
    }
}

Spring Initializr方式#

  • 创建Spring Initializr项目
创建Spring Initializr项目
  • 选中需要的启动器(spring-boot-starter-xxx)
选中需要的启动器
  • 创建工具会引入相关依赖,并自动生成配置文件启动类

依赖管理机制#

场景启动器#

Spring场景启动器会将该场景需要的依赖全部导入

场景启动器命名规则

  • 官方场景:spring-boot-starter-xxx
  • 第三方场景:xxx-spring-boot-starter
spring-boot-starter-web导入web开发的全部依赖

版本管理#

依赖管理机制

Spring Boot 父项目spring-boot-starter-parent继承自spring-boot-dependencies项目(版本仲裁中心),该项目通过 <dependencyManagement> 管理依赖版本。

spring-boot-dependencies负责版本管理

Maven版本具有就近原则特性,如果我们不想使用Spring Boot提供的依赖版本。可以在当前项目自定义<properties> 标签自定义版本,标签名需要与spring-boot-dependencies中的一致。

自动配置机制#

spring-boot-autoconfigure依赖#

所有spring-boot-starter-xxx启动器都会依赖spring-boot-starter依赖。

以spring-boot-starter-web为例,所有场景启动器内部都会依赖spring-boot-starter

spring-boot-starter依赖内部会依赖spring-boot-autoconfigure依赖。spring-boot-autoconfigure负责自动配置。

配置属性类#

在Spring Boot配置文件application.yml中,所有配置项都和某个类的属性值是一一绑定的。

比如,配置文件中的server.port属性值就对应org.springframework.boot.autoconfigure.web.ServerProperties类中的port属性的值。

属性类可以通过@ConfigurationProperties注解指定配置的前缀。

通过@ConfigurationProperties注解指定配置的前缀

也可以使用@EnableConfigurationProperties注解指定配置类:

指定配置类
可以在官方文档中查看全部配置对应的配置类

按需自动配置#

spring-boot-autoconfigure会使用@ConditionalOnxxx条件注解在条件满足时自动配置。

  • @ConditionalOnClass:如果类路径中存在该类,则触发指定行为。
  • @ConditionalOnMissingClass:如果类路径中不存在该类,则触发指定行为。
  • @ConditionalOnBean:如果容器中存在该类,则触发指定行为。
  • @ConditionalOnMissingBean:如果容器中不存在该类,则触发指定行为。

完整流程#

执行流程
Spring Boot 自动配置机制

包扫描配置#

默认配置#

默认情况下,Spring Boot会扫描入口类下面以及其子包下的所有类。

Java
@SpringBootApplication
public class SpringBootHelloApplication {
    /*
     * Spring Boot启动代码
     * */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloApplication.class, args);
    }
}

scanBasePackages参数#

可以使用@SpringBootApplication注解的scanBasePackages参数来配置包的扫描范围。

Java
@SpringBootApplication(scanBasePackages = "com.luguosong")
public class SpringBootHelloApplication {
    /*
     * Spring Boot启动代码
     * */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloApplication.class, args);
    }
}

@ComponentScan注解#

可以使用@ComponentScan注解来配置包的扫描范围

Java
@SpringBootApplication
@ComponentScan("com.luguosong")
public class SpringBootHelloApplication {
    /*
     * Spring Boot启动代码
     * */
    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloApplication.class, args);
    }
}

Profiles#

Spring Profiles 提供了一种方法,可以将应用程序配置的部分进行隔离,使其仅在特定环境中可用。任何 @Component、@Configuration 或 @ConfigurationProperties 都可以使用 @Profile 标注,以限制其加载时机,如下例所示:

Java
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration(proxyBeanMethods = false)
@Profile("production")
public class ProductionConfiguration {

    // ...

}

Note

如果通过@EnableConfigurationProperties而不是自动扫描来注册@ConfigurationProperties bean,则需要在具有@EnableConfigurationProperties注解的@Configuration类上指定@Profile注解。在扫描@ConfigurationProperties的情况下,可以直接在@ConfigurationProperties类上指定@Profile注解。

您可以使用 spring.profiles.active 环境属性来指定哪些配置文件是激活的。您可以通过本章前面描述的任何方式来指定该属性。例如,您可以将其包含在 application.yml 文件中,如下例所示:

YAML
spring:
  profiles:
    active: "dev,hsqldb"

您还可以在命令行中使用以下开关指定它:--spring.profiles.active=dev,hsqldb

如果没有激活任何配置文件,则会启用默认配置文件。默认配置文件的名称是 default,可以使用 spring.profiles.default Environment 属性进行调整,如下例所示:

YAML
spring:
  profiles:
    default: "none"

spring.profiles.activespring.profiles.default 只能用于非特定配置文件的文档。这意味着它们不能包含在特定配置文件中,也不能用于通过 spring.config.activate.on-profile 激活的文档。

例如,第二个文档配置无效:

YAML
# 此文件有效
spring:
  profiles:
    active: "prod"
---
# 该文件无效。
spring:
  config:
    activate:
      on-profile: "prod"
  profiles:
    active: "metrics"

添加Active Profiles#

spring.profiles.active 属性遵循与其他属性相同的排序规则:优先级最高的 PropertySource 会生效。这意味着你可以在 application.yml 中指定活动的配置文件,然后通过命令行开关进行替换。

有时候,添加属性以补充现有的活动配置文件而不是替换它们是很有用的。可以使用 spring.profiles.include 属性在 spring.profiles.active 属性激活的配置文件基础上添加活动配置文件。SpringApplication 的入口点也提供了一个 Java API 用于设置额外的配置文件。请参阅 SpringApplication 中的 setAdditionalProfiles() 方法。

例如,当运行具有以下属性的应用程序时,即使使用 --spring.profiles.active 开关运行,commonlocal配置文件也会被激活:

YAML
spring:
  profiles:
    include:
      - "common"
      - "local"

Warning

spring.profiles.active 类似,spring.profiles.include 只能用于非特定配置文件的文档。这意味着它不能包含在特定配置文件中,也不能用于通过 spring.config.activate.on-profile 激活的文档。

在下一个部分中描述的配置文件组也可以用于在某个配置文件处于活动状态时添加活动配置文件。

Profile Groups#

有时,您在应用程序中定义和使用的配置文件过于细化,使用起来变得繁琐。例如,您可能有用于分别启用数据库和消息功能的proddb和prodmq配置文件。

为此,Spring Boot 允许您定义配置文件组。配置文件组使您可以为一组相关的配置文件定义一个逻辑名称。

例如,我们可以创建一个由我们的proddb和prodmq配置文件组成的生产组。

YAML
spring:
  profiles:
    group:
      production:
        - "proddb"
        - "prodmq"

我们的应用程序现在可以使用 --spring.profiles.active=production 来启动,从而一次性激活 production、proddb 和 prodmq 配置文件。

Warning

与 spring.profiles.active 和 spring.profiles.include 类似,spring.profiles.group 只能用于非特定配置文件的文档。这意味着它不能包含在特定配置文件中,也不能在通过 spring.config.activate.on-profile 激活的文档中使用。

程序化设置Profiles#

在应用程序运行之前,可以通过调用 SpringApplication.setAdditionalProfiles(…) 来以编程方式设置活动配置文件。也可以使用 Spring 的 ConfigurableEnvironment 接口来激活配置文件。

特定配置文件#

特定配置文件的 application.properties(或 application.yaml)以及通过 @ConfigurationProperties 引用的文件都会被视为文件并加载。详情请参阅特定配置文件。

评论