Spring Boot学习笔记

知识分子没文化
2021-12-20 / 0 评论 / 1,668 阅读 / 3,733 字数 / 正在检测是否收录...

目录

一、Spring Boot简介

Spring Boot 是 Spring 框架的一个扩展,旨在简化 Spring 应用的初始搭建和开发过程。它通过自动配置约定优于配置的原则,提供一个开箱即用的应用程序架构,能够快速构建独立运行的 Spring 应用,开发者基于 Spring Boot 的预置结构继续开发,省时省力。

Spring Boot 官方文档:https://docs.spring.io/spring-boot/index.html

Spring 中文网翻译的 Spring Boot 中文文档:https://springdoc.cn/spring-boot

通过 IDEA 创建 Spring Boot 项目:

01

添加核心依赖 Spring Web:

02

除了用 IDEA 创建 Spring Boot 项目,也可以直接访问 Spring Boot 项目生成网站,设定项目的元数据(如项目类型、语言、Spring Boot 版本等)之后,创建好的项目就会以压缩包的格式下载到本地,解压导入到开发工具即可。

Spring Boot 项目生成网站:

  • https://start.spring.io/:Spring Boot 官方的项目生成工具,Java 版本和 Spring Boot 版本都比较新,国内有可能访问不了或访问速度比较慢
  • https://start.springboot.io/:官方项目生成工具的国内镜像,Java 版本和 Spring Boot 版本与官网一致,国内都能访问
  • https://start.aliyun.com/:从域名能看出来是阿里云镜像,国内都能访问,而且能用旧的 Java 版本和 Spring Boot 版本生成项目

一个典型的 Spring Boot 项目结构如下:

SpringBoot-project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── MyApplication.java
│   │   └── resources/
│   │       ├── application.properties
│   │       └── static/
│   │       └── templates/
│   └── test/
│       └── java/
│           └── com/
│               └── example/
│                   └── MyApplicationTests.java
├── pom.xml
└── README.md
  • MyApplication.java:Spring Boot 应用的主类,使用 @SpringBootApplication 注解标记。
  • application.properties:Spring Boot 应用的配置文件,可以配置各种属性。
  • static/:存放静态资源文件,例如 HTML、CSS、JavaScript 文件等。
  • templates/:存放模板文件,例如 Thymeleaf、Freemarker 等。

二、Spring Boot的主要特性

2.1、自动配置

开发者无需手动配置大量 XML 或注解,Spring Boot 能够根据项目中添加的依赖,自动为应用程序生成合理的默认配置,减少手动配置。例如,在项目中添加了 spring-boot-starter-web 依赖,Spring Boot 会自动配置嵌入式的 Tomcat 服务器,并为 Spring MVC 设置好必要的组件,如 DispatcherServlet 等,无需开发者手动编写大量的配置代码。

2.2、起步依赖(Starters)

起步依赖是指对常用库和框架的依赖声明的集合,使用起步依赖可以一次性地添加相关的依赖和配置到项目中,大大简化了项目的依赖管理,减少因依赖冲突而导致的问题。

比如,spring-boot-starter-data-jpa 包含了使用 Spring Data JPA 进行数据库操作所需的所有依赖,包括 Hibernate、Spring Data JPA 和数据库连接池等。

2.3、简化配置

Spring Boot 使用 application.propertiesapplication.yml 作为统一的配置文件,将应用程序的各种配置集中管理,并且提供默认配置,尽量减少开发者的手动配置。这些配置文件放置在项目的类路径下,Spring Boot 会自动加载并应用其中的配置。

并且 Spring Boot 支持多环境配置,允许开发者根据不同的运行环境(如开发、测试、生产)使用不同的配置文件。通过在配置文件名中使用 {profile} 占位符,如 application-dev.ymlapplication-prod.yml,并在 application.yml 中指定 spring.profiles.active 属性来激活相应的环境配置。

2.4、内置服务器

Spring Boot 支持嵌入式的服务器,如 Tomcat、Jetty 和 Undertow 等,开发者可以将应用程序打包成一个可执行的 JAR 文件,使用 java -jar 命令可启动服务,无需单独部署到外部的应用服务器上。

例如,在开发 Web 应用时,只需在 pom.xml 文件中添加 spring-boot-starter-web 依赖,Spring Boot 会自动配置并启动一个嵌入式的 Tomcat 服务器,让开发者可以快速进行开发和测试。

2.5、无代码生成与 XML 配置

Spring Boot 无需代码生成和 XML 配置,完全基于注解和 Java 配置。

三、Spring Boot的配置

3.1、配置文件类型

Spring Boot 支持两种主要的配置文件类型:application.propertiesapplication.yaml(.yml)

3.1.1、application.properties

这是传统的 Java 配置文件格式,每行定义一个属性,采用 key=value 的形式。例如:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/spring_db
spring.datasource.username=root
spring.datasource.password=password
3.1.2、application.yaml(或.yml)

YAML(YAML Ain't Markup Language)是一种人类可读的数据序列化格式,它的特点包括:

  • 使用缩进(空格数不限)表示层级关系(必须用空格缩进,不能使用 Tab)
  • 使用 key: value 的形式表示键值对
  • 支持列表、嵌套结构等复杂数据类型

例如:

server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password

关于 .yaml.yml 的区别:

在 Spring Boot 项目中,YAML 文件通常以 .yaml.yml 作为文件扩展名。

这两种扩展名本质上是相同的,它们都表示 YAML 格式的文件。.yaml 是 YAML 文件的官方推荐扩展名,而 .yml.yaml 的简写形式。在功能上两者完全等价,Spring Boot 对它们的解析方式没有任何区别,无论使用 .yaml 还是 .yml,Spring Boot 都能正确加载和解析配置文件。

如果同时存在 application.yamlapplication.ymlSpring Boot 会优先加载 application.yml

3.2、配置优先级

3.2.1、配置文件位置的优先级

优先级最高的配置是命令行参数,通过命令行传递的这个参数将会覆盖原配置:

java -jar app.jar --server.port=9999

不同位置配置文件的优先级分别为:

  • 项目根目录下的 /config 子目录中的配置文件
  • 项目根目录中的配置文件
  • 类路径下的 /config 包中的配置文件
  • 类路径根目录中的配置文件
3.2.2、配置文件格式的优先级

如果在同一个目录下同时存在 application.propertiesapplication.ymlapplication.yaml 这几个文件,那么 Spring Boot 对配置文件的加载优先级为:

application.properties > application.yml > application.yaml

3.3、读取配置文件的方式

假设在 YAML 配置文件中存在如下配置:

server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/spring_db?useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

userInfo:
  name: 张三
  age: 30
  likes:
    - 游戏
    - 健身
    - 读书
3.3.1、使用@Value注解

@Value 注解可以直接将配置文件中的单个属性值注入到类的字段中。

@Component
public class ConfiurationBean {

    // 简单属性
    @Value("${spring.datasource.url}")
    private String url;

    // 数组
    @Value("${userInfo.likes}")
    private String[] likes;

    // 数组里的其中一个属性
    @Value("${userInfo.likes[1]}")
    private String like;

    // ...
}
3.3.2、使用Environment对象

在 Spring Boot 中,Environmentorg.springframework.core.env.Environment)是一个用于管理应用程序运行时环境配置信息的接口,它可以使开发者方便地获取和使用项目的配置参数,无论是来自 application.propertiesapplication.yml 文件,还是系统环境变量、命令行参数等。

在需要使用 Environment 对象的类中,可以使用 @Autowired 注解将 Environment 对象自动注入进来,然后在类的方法中使用 getProperty() 方法获取配置信息。

@Component
public class ConfiurationBean {

    @Autowired
    private Environment env;

    public void printProperty() {
        // 获取并使用属性
        String port = env.getProperty("server.port");
        System.out.println(port);
    }
}
3.3.3、将部分配置封装成实体类

创建一个 Java 实体类,属性与配置项一一对应,使用 @ConfigurationProperties 注解将配置文件中的属性绑定到该 Java 对象上:

@Component
@ConfigurationProperties(prefix = "userInfo")
public class UserInfo() {    
    private String name;

    private int age;

    private String[] likes;

    // get方法、set方法、构造方法
}

3.4、多环境开发时配置文件的切换

在项目的开发中,常常需要在多个环境(开发环境 dev、生产环境 prod 等)部署项目,并且每个环境的配置可能都不太一样(如日志等级、数据库属性等),因此每个环境都有单独的一个配置文件。

Spring Boot 支持根据不同的环境加载不同的配置文件,常用的做法是建一个公共配置文件 application.propertiesapplication.yml 来存放每个环境中相同的配置,再给每一个环境建一个单独的配置文件存放个性化配置,该配置文件的命名规则为 application-{profile}.propertiesapplication-{profile}.yml

例如开发环境的配置文件为 application-dev.yml,生产环境的配置文件为 application-prod.yml,则在公共配置文件 application.yml 中激活指定配置文件的方式为:

spring:
  profiles:
    active: dev

也可以在启动项目 JAR 文件时通过命令行参数 spring.profiles.active 指定:

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

如果既在公共配置文件 application.yml/application.properties 中指定了激活哪个配置文件,又通过命令行参数指定,则最后生效的是命令行参数,因为命令行参数的优先级最高。

在 IDEA 中也可以直接指定命令行参数:

03

新版本 IDEA:

04

3.5、yml配置文件示例

server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_db?useSSL=false&setUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 数据源用druid
    type: com.alibaba.druid.pool.DruidDataSource

# MyBatis配置
mybatis:
  # 指定Mapper XML文件的位置
  mapper-locations: classpath:mapper/*.xml
  # 实体类的包路径
  type-aliases-package: com.example.demos.web
  configuration:
    # 开启驼峰命名映射
    map-underscore-to-camel-case: true

# 项目日志等级
logging:
  level:
    # 全局日志等级
    root: info
    # 设置MyBatis的日志级别为DEBUG
    com.example.mapper: debug
    org.mybatis: debug
    org.apache.ibatis: debug

# 自定义配置

四、整合MyBatis

4.1、添加起步依赖

新版 IDEA 中可以直接在 pom.xml 文件的 <dependencies> 标签旁边点击 “Add Starters” 添加 MyBatis 与 MySql 的起步依赖:

05

或者手动在 pom.xml 文件中添加 MyBatis 的起步依赖与 MySQL、Druid 的依赖坐标:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.22</version>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

4.2、添加配置

然后在配置文件中添加数据源与 MyBatis 配置:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/spring_db?useSSL=false&setUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 使用druid数据源
    type: com.alibaba.druid.pool.DruidDataSource

# MyBatis配置
mybatis:
  # 指定Mapper XML文件的位置
  mapper-locations: classpath:mapper/*.xml
  # 实体类的包路径
  type-aliases-package: com.example.demos.web
  # 指定MyBatis的全局配置文件位置,可以进行更细颗粒度的MyBatis配置,不需要就不写
  #  config-location: classpath:mybatis-config.xml
  configuration:
    # 开启驼峰命名映射
    map-underscore-to-camel-case: true

# 项目日志等级
logging:
  level:
    # 全局日志等级
    root: info
    # 设置MyBatis的日志级别为DEBUG
    com.example.mapper: debug
    org.mybatis: debug
    org.apache.ibatis: debug

4.3、扫描Mapper接口

最后在写接口的时候在上面用 @Mapper 注解标记一下这是 MyBatis 的 Mapper 接口:

@Mapper
public interface UserMapper {
    User select();

    // ...
}

或者直接在 Spring Boot 启动类上面用注解 @MapperScan() 进行全局配置扫描,指定 Mapper 接口类的包路径,Spring 会自动扫描该包下的所有接口,并将其注册为 MyBatis 的 Mapper 接口,无需在每个接口上都添加 @Mapper 注解。

@SpringBootApplication
@MapperScan("com.example.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

至此,Spring Boot 框架整合 MyBatis 框架完成。

五、使用Maven打包Spring Boot项目

pom.xml 文件中,确保配置了 Spring Boot Maven 插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.6.3</version>
            <configuration>
                <!-- 指定启动程序主类 -->
                <mainClass>com.example.demo.DemoApplication</mainClass>
                <skip>false</skip>
            </configuration>
        </plugin>
    </plugins>
</build>

在项目根目录下运行打包的命令:

# 其实是两条命令,mvn clean是清除项目target目录下的文件,mvn package打包命令,两个命令一起执行。
# -Dmaven.test.skip=true表示排除测试代码之后打包
mvn clean package -Dmaven.test.skip=true

或者在 IDEA 中依次操作 cleanpackage

06

打包时,一般都要先进行 clean 操作清理项目之前构建过程中生成的临时文件和输出文件,使项目恢复到初始状态,目的是确保项目不会受到之前构建结果的影响,避免旧的文件干扰新的构建过程。

打包完成后,会生成两个 JAR 文件,其中一个后缀为 .original,只包含工程中的 Class,不包含依赖;另一个后缀为 .jar 的文件是 SpringBoot 打包插件创建的,包含了应用依赖和 Spring Boot 相关的 Class,可以直接运行。生成的 JAR 文件保存在 target 目录下,文件名为 {项目名称}-{版本号}.jar。例如:demo-0.0.1-SNAPSHOT.jar

使用以下命令运行打包好的 JAR 文件:

java -jar demo-0.0.1-SNAPSHOT.jar

并且可以通过命令来指定部分参数:

java -jar demo-0.0.1-SNAPSHOT.jar --server.port=9999 --spring.profiles.active=prod
0

评论 (0)

取消