Spring Boot 框架使用指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 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 值从小到大依次执行。即值越小拥有越高的优先级,值越小越先被加载。

    注:值可为负数。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
XML 安全 Java
|
2月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
53 0
|
9天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
5天前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
28 13
|
16天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
34 5
|
27天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
62 8
|
2月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
74 6
|
2月前
|
Java 数据库连接 数据库
不可不知道的Spring 框架七大模块
Spring框架是一个全面的Java企业级应用开发框架,其核心容器模块为其他模块提供基础支持,包括Beans、Core、Context和SpEL四大子模块;数据访问及集成模块支持数据库操作,涵盖JDBC、ORM、OXM、JMS和Transactions;Web模块则专注于Web应用,提供Servlet、WebSocket等功能;此外,还包括AOP、Aspects、Instrumentation、Messaging和Test等辅助模块,共同构建强大的企业级应用解决方案。
102 2
|
2月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
35 0
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
52 0