跳转至

基础知识#

约 760 个字 35 行代码 预计阅读时间 16 分钟

功能概述#

  • 创建独立的 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);
    }
}

评论