Spring Boot 框架使用指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Boot 框架使用指南

概述

Spring官网:https://spring.io/projects

Spring Boot 是在Spring框架基础上创建的一个全新框架,是Spring项目中的一个子工程,与Spring-framework 同属于Spring的产品。

Spring Boot 称为搭建程序的脚手架 。其最主要作用是快速的构建庞大的Spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让开发者关注于业务而非配置。

Spring Boot 简化了基于Spring的应用开发,为Spring平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器starter),多数Spring Boot应用只需要很少的Spring配置。 Spring Boot 内置了tomcat,无需再单独配置tomcat。

Spring Boot 设计的目的是简化 Spring 应用的搭建和开发过程,它不但具有Spring的所有优秀特性,而且具有如下显著的特点:

  • 为 Spring 开发提供更加简单的使用和快速开发的技巧
  • 具有开箱即用的默认配置功能,能根据项目依赖自动配置
  • 具有功能更加强大的服务体系,包括嵌入式服务、安全、性能指标,健康检查等
  • 绝对没有代码生成,可以不再需要 XML 配置,即可让应用更加轻巧和灵活
  • Spring Boot 对于一些第三方技术的使用,提供了非常完美的整合,使用简单。


SpringBoot 项目搭建

基础依赖引入

Spring Boot 官网版本列表:https://spring.io/projects/spring-boot#learn

  • RELEASE GA:General Availability,正式发布的版本,官方推荐使用此版本。
  • SNAPSHOT:快照版,可以稳定使用,且仍在继续改进版本。
  • PRE:预览版,内部测试版,主要是给开发人员和测试人员测试和找BUG用的,不建议使用。
<?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.test</groupId>
    <artifactId>spring-boot-ssm</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!-- 使用SpringBoot框架必须引入 spring-boot-starter-parent 作为父项目 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>
    
    <properties>
        <!-- 设置JDK版本 -->
        <java.version>1.8</java.version>
    </properties>
    
    <dependencies>
        <!-- web启动器 -->
        <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>
        
        <!---- 数据库相关 ---->
        <!-- jdbc启动器,spring-boot-starter-jdbc默认集成了HikariCP连接池 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- druid连接池启动器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.17</version>
        </dependency>
        <!-- 数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- 持久层框架启动器 -->

        
        <!---- 工具类 ---->
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

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


启动类

App.java

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

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


Spring Boot 配置

Spring 加载配置的注解

  • @Configuration :声明一个类作为配置类,代替 xml 文件
  • @Bean : 声明在方法上,将方法的返回值加入 Bean 容器,代替 <bean>标签
  • @Value :属性注入,替代 xml 中的属性注入

    格式: @Value("${属性}")

  • @PropertySource :加载指定的属性文件(*.properties)到 Spring 的 Environment 中

    可以配合 @Value 和 @ConfigurationProperties 使用

    • @PropertySource 和 @Value 组合使用:

      可以将自定义属性文件中的属性变量值注入到当前类的使用@Value注解的成员变量中。

    • @PropertySource 和 @ConfigurationProperties 组合使用:

      可以将属性文件与一个Java类绑定,将属性文件中的变量值注入到该Java类的成员变量中。


@ConfigurationProperties:自动配置绑定

@ConfigurationProperties:用于自动配置绑定 yml 配置文件的属性和 java 对象的属性

支持属性:

  • value / prefix 属性:配置文件配置项前缀
  • ignoreInvalidFields 属性:默认为false,值类型不匹配将会爆出异常
  • ignoreUnknownFields 属性:默认为true,忽略掉对象中未知的字段

用法1:标注在类上,转换配置文件配置项为bean对象

  • 注意:

    • 需要将标注了 @ConfigurationProperties 注解的类注册到spring容器中,方式有两种:

      • 方式1:在标注了@ConfigurationProperties 注解的类上使用 @componet 等 IOC 注解
      • 方式2:在标注了@componet 等 IOC 注解的类上或配置类上标注 @EnableConfigurationProperties(bean类名.class)
    • 需要有无参构造方法、getter和setter方法
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "app.mycar")
public class Car {
    private int price;
    private String brand;
}
@Configuration
@EnableConfigurationProperties(Car.class) 
public class Config {
}

用法2:标注在配置类的方法上,搭配 @bean 使用,绑定第三方属性

@Configuration
public class DbConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DataSource datasource(){
        return new DruidDataSource();
    }
}


Environment:获取运行环境变量

Spring中的Environment用来表示整个应用运行时的环境,可以使用Environment类获取整个运行环境中的配置信息。

方法:

public String getProperty(String key)
public <T> T getProperty(String key, Class<T> targetType)
    
// 注:key为配置文件中的key

示例:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration  // 声明这个类是一个配置类
@PropertySource(value = "classpath:user.properties") //加载配置文件
public class UserConfig {
    @Autowired
    private Environment environment;
    
    @Bean   //创建User对象,交给spring容器 User对象中的值从配置文件中获取
    public User getUser() {
        User user = new User();
        user.setUsername(environment.getProperty("user.username"));
        user.setPassword(environment.getProperty("user.password"));
        return user;
    }
}


支持的配置文件类型及优先级

支持的配置文件类型:

  • application.properties
  • application.yml
  • application.yaml

配置文件被加载的优先级是:

  • properties > yml > yaml
  • 相同的配置在多种配置文件类型中都配置了,则优先级高的配置生效


默认配置和常用基础配置

Spring Boot 封装了大量的默认配置:

Spring Boot 常用基础配置:

server:
  # 服务端口号,默认8080
  port: 8080

logging:
  level:
    # 微服务的日志配置。格式:包路径: 日志级别
    com.test: debug

spring:
  application:
    name: test-service
  datasource:     # 数据源配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/leyou?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
    type: com.alibaba.druid.pool.DruidDataSource


Spring MVC 配置

端口配置

设置web访问端口

server:
 port: 8080


日志配置

日志级别分为 FATAL、ERROR、WARN、INFO、DEBUG、ALL 或者自定义的级别。

Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR、WARN、INFO、DEBUG

  • 企业生产环境,一般设置为 INFO 级别,表示打印 INFO 及以上级别的日志,不打印 DEBUG 及以下级别的日志
  • 开发和测试环境,一般设置为 DEBUG 级别,表示所有的级别的日志都能输出

日志级别控制:

logging:
  level:
    com.test: debug
    org.springframework.web: debug

说明:

  • logging.level:固定写法,说明下面是日志级别配置,日志相关其它配置也可以使用
  • com.test 和 org.springframework 是指定包名,后面的配置仅对这个包有效


静态资源

默认的静态资源路径为:

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public

只要静态资源放在这些目录中任何一个,SpringMVC都会处理。

一般把静态资源放在classpath:/static/目录下。


拦截器

  • 如果想要保持 Spring Boot 的一些默认 MVC 特征,同时又想自定义一些 MVC 配置(包括:拦截器,格式化器, 视图控制器、消息转换器 等等),可以让一个类实现 WebMvcConfigurer 接口,并且添加 @Configuration 注解,但不能添加@EnableWebMvc 注解
  • 如果想要自定义 HandlerMappingHandlerAdapterExceptionResolver 等组件,可以创建一个 WebMvcRegistrationsAdapter 实例来提供以上组件
  • 如果想要完全自定义 Spring MVC,不保留 Spring Boot 提供的一切特征,可以自己定义类并且添加 @Configuration 注解和 @EnableWebMvc 注解

实现步骤:

  1. 自定义拦截器(实现 HandlerInterceptor 接口)
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.debug("preHandle方法执行...");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.debug("postHandle方法执行...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.debug("afterCompletion方法执行...");
    }
}
  1. 添加配置类(实现 WebMvcConfigurer 接口),注册拦截器
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    /**
     * 注册自定义拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 通过registry来注册拦截器,通过addPathPatterns来添加拦截路径
        registry.addInterceptor(new MyInterceptor())
                .addPathPatterns("/user/**")
                .excludePathPatterns("/user/login");  // 这个地址的不拦截
    }
}


ApplicationRunner 接口

  • 方法:

    只定义了一个 run(ApplicationArguments args) 方法

    run 方法的参数 ApplicationArguments 可以获取到当前项目执行的命令参数(比如把这个项目打成 jar 执行的时候,带的参数可以通过 ApplicationArguments 获取到)。

    由于该方法是在容器启动完成之后,才执行的,所以,这里也可以从 spring 容器中拿到其他已经注入的 bean。

  • 使用场景:

    springBoot 项目启动时,若想在启动之后直接执行某一段代码,就可以自定义一个类实现 ApplicationRunner 这个接口,并重写接口的 run 方法。

@Component  // 此类必须要交给spring管理才生效
public class ConsumerRunner implements Application{
    @Oberride
    public void run(ApplicationArgumers args) throws Exception{
        //代码
        System.out.println("需要在springBoot项目启动时执行的代码---");
    }
}
  • 在同一个项目中,可以定义多个 ApplicationRunner 的实现类。

    如果有多个实现类,同时又需要它们按一定顺序执行,可以通过在实现类上加上 @Order 注解或者实现 Ordered 接口来实现。

    SpringBoot 会按照 @Order 中的 value 值从小到大依次执行。即值越小拥有越高的优先级,值越小越先被加载。

    注:值可为负数。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
10 1
|
2天前
|
Java 数据安全/隐私保护 Spring
Java 中 Spring Boot 框架下的 Email 开发
Java 中 Spring Boot 框架下的 Email 开发
28 2
|
2天前
|
缓存 前端开发 Java
【框架】Spring 框架重点解析
【框架】Spring 框架重点解析
17 0
|
2天前
|
前端开发 Java 开发者
【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用
【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用
8 0
|
2天前
|
JSON 前端开发 Java
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解(下)
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解
6 0
|
2天前
|
JSON 前端开发 Java
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解(上)
【JavaEE】让“单车变摩托”的神级框架—Spring MVC的深入讲解
5 0
|
2天前
|
XML Java 应用服务中间件
【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识
【JavaEE】JavaEE进阶:框架的学习 - Spring的初步认识
6 0
|
2天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
17 4
|
2天前
|
XML Java 数据库连接
Spring框架与Spring Boot的区别和联系
Spring框架与Spring Boot的区别和联系
23 0
|
2天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
56 0