1、初识Spring Boot框架


1.1 Spring Boot框架定义

Spring Boot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,同时Spring Boot还集成了大量常用的第三方库配置,本质上是基于Spring的Web应用程序开发框架

1.2 Spring Boot框架的优点

  1. 快速构建独立的Spring应用依靠大量的注解实现自动化配置的全新框架。
  2. 易于部署:内嵌了Tomcat、Jetty和Undertow服务器,自动将项目打包,并在项目运行时部署到服务器中。
  3. 简化配置:通过自动配置和starter依赖的方式,简化了Maven配置。
  4. 自动配置:根据当前类路径下的类jar包来自动配置bean。
  5. 提供生产就绪功能:健康检查、外部化配置、安全管理。
  6. 极少的代码生成和xml配置:使用大量的注解完成。

1.3 Spring Boot主要的三个依赖

  1. spring-boot-starter-parent:Spring Boot框架集成项目的统一父类管理依赖
  1. 如果在pom.xml文件中引入的依赖不是spring-boot-starter-parent所管理的,需要在引入依赖时指定对应的版本号,使用版本号标签。
  1. spring-boot-devtools实现Spring Boot的热部署,即每次修改不需要重新启动项目。
  2. spring-boot-starter-web提供web开发场景所需要的底层所有依赖文件,也对版本作了统一管理。

1.4 关于@SpringBootApplication和@RestController注解

  1. @RestController:它是@ResponseBody+@Controller的组合注解标注在Controller类上,它会将类作为Controller层加到Spring容器中,同时该类的方法无法返回JSP页面,而且会返回JSON格式的字符串
  2. @SpringBootApplication:Spring Boot的核心注解,标注在启动类上,是启动类的入口。main方法中调用SpringApplication.run(启动类.class, args)以此来启动Spring Boot。它也是一个组合注解,包括:
  1. @SpringBootConfiguration:可以被组件扫描器扫描的配置类,内部包含了@Configuration注解
  2. @EnableAutoConfiguration:开启自动配置的功能,实现自动化配置。内部由两个核心注解组成:@AutoConfigurationPackage+@Import。获取项目主程序启动类所在的根目录,从而指定后续组件要扫描的包位置。
  3. @ComponentScan组件包扫描器,用于将指定包中的注解自动装配到Spring的Bean容器中

1.5 Spring Boot自动配置的原理

  • 注解@EnableAutoConfiguration@Configuration@ConditionalOnClass就是自动配置的核心。
  • @EnableAutoConfiguration给容器导入META-INF/spring.factories里定义的自动配置类,筛选有效的自动配置类,每一个自动配置类结合对应的xxxProperties.java读取配置文件进行自动配置功能。

1.6 Spring Boot执行流程

  1. SpringApplication实例的初始化。
  2. 项目的初始化启动,调用run方法。
  3. 运行Soring Boot的方式
  1. 打包命令或放到容器中运行
  2. 用Maven插件运行
  3. 直接执行main方法执行

1.7 Spring Boot打成的jar和普通的jar有什么区别

  1. Spring Boot项目最终打包成的jar是可执行jar ,这种jar可以直接通过java -jar xxx.jar命令来运行,这种jar不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。
  2. Spring Boot的jar无法被其他项目依赖,主要还是它和普通jar的结构不同普通的jar包,解压后直接就是包名,包里就是我们的代码,而Spring Boot打包成的可执行jar解压后,在\BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在pom.xml文件中增加配置,将Spring Boot项目打包成两个jar,一个可执行,一个可引用。

1.8 JavaWeb、Spring、Spring MVC和Spring Boot有什么区别,都是做什么用的

  1. JavaWebJava语言的Web开发技术,主要用于开发Web应用程序,包括基于浏览器的客户端和基于服务器的Web服务器。
  2. Spring是一个轻量级的开源开发框架,主要用于管理Java应用程序中的组件和对象,并提供各种服务,如事务管理、安全控制、面向切面编程和远程访问等。它是一个综合性框架,可应用于所有类型的Java应用程序。
  3. Spring MVCSpring框架中的一个模块,用于开发Web应用程序并实现 MVC(模型-视图-控制器)设计模式,它将请求和响应分离,从而使得应用程序更加模块化、可扩展和易于维护
  4. Spring Boot基于Spring框架开发的用于开发Web应用程序的框架,它帮助开发人员快速搭建和配置一个独立的、可执行的、基于Spring的应用程序,从而减少了繁琐和重复的配置工作。

总结JavaWeb是基于Java语言的Web开发技术,而Spring是一个综合性的开发框架,Spring MVC用于开发Web应用程序实现MVC设计模式,而Spring Boot是基于Spring的Web应用程序开发框架


2、Spring Boot核心配置文件


2.1 Spring Boot全局配置

全局配置文件能够对一些默认配置进行修改。一般由application.propertiesapplication.yaml文件作为全局的配置文件,properties的优先级高于yaml文件的优先级

配置加载顺序:properties > yaml > 系统环境变量 > 命令行参数

2.2 properties和yaml格式的使用

  1. properties
  1. 简介:定义Spring Boot项目相关属性,可以是系统属性、环境变量、命令参数等信息。启动时会自动加载全局配置文件。
# application.properties
server.address=80
server.port=8081
  1. yaml
  • 简介:JSON超集文件格式。以数据为核心,是一种更为直观且容易被计算机识别的数据序列化格式。使用key:(空格)value格式配置属性,使用缩进控制层级关系
  • 具体使用
  • value值为普通数据类型(数字、布尔、字符串等),不需要加引号
server:
  port: 8081
  address: 80
  • value值为数组和单列集合
(1)缩进式:-(空格)属性值 或 逗号分隔
person:
  hobby: 
    - play
    - read
    - sleep
(2)行内式:[]可以省略,系统自动匹配
person:
  hobby: [ play,read,sleep ]
  • value值为Map集合和对象
(1)缩进式
person:
  map: 
    k1: v1
    k2: v2
(2)行内式
person:
  map: { k1: v1, k2: v2 }
  • 使用yaml配置的优势
  1. 配置有序
  2. 简洁明了,支持数组
  • 缺陷:不支持@PropertySource注解导入的自定义yaml文件

2.3 配置文件属性值的注入

  1. @ConfigurationProperties:将配置文件中的自定义属性值批量注入某个Bean对象的多个对应属性中。一般配合@Component使用,先将类交由Spring容器管理,以便于能够扫描到,保证文件中的属性与应用实体类属性名一致,否则无法注入。例@ConfigurationProperties(prefix="person")表示将配置文件中以person开头的属性值通过setter方法注入实体类对应的属性中。
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private Integer id;
    private String name;
    private Integer age;
    private List<String> hobby;
    private Map map;
}
  1. @Value:用来读取配置文件中的属性值,并逐个注入Bean对象的对应属性中。使用@Value注入的属性类型只能是普通数据类型(数字、字符串、布尔等),语法:@Value("${属性}")
@Value("${person.id}")
private Integer id;

2.4 @ConfigurationProperties和@Value注解的区别

  1. 底层框架@ConfigurationProperties注解是Spring Boot框架自带的,@Value注解是Spring框架支持的。
  2. 功能@ConfigurationProperties注解能够将配置文件的属性值批量注入Bean对象,而@Value只能单个注入
  3. 属性的setter方法:@ConfigurationProperties进行属性值注入时,Bean中必须有对应属性的setter方法,若没有,则属性值为空,@Value不需要setter方法,它会先读取配置中的值,然后自动注入到属性中。
  4. 复杂类型属性注入:@ConfigurationProperties支持任意数据类型的属性注入,而@Value只能注入普通的数据类型。
  5. EL表达式:@Value支持此表达式,@ConfigurationProperties不支持。@Value("#{5*2}")

2.5 @ConfigurationProperties和@Value注解的使用场景

  1. 如果只是针对某一个业务需求,需要引入配置文件中的个别属性值,使用@Value注解。
  2. 如果针对某个JavaBean类,需要批量引入配置文件中属性值,使用@ConfigurationProperties注解。
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource getDruid() {
    return new DruidDataSource();
}

2.6 Spring Boot导入自定义配置文件

  1. @PropertySource:加载自定义配置文件,指定文件的位置和名称。@PropertySource("classpath:test.properties"),该注解不支持导入yaml类型文件
  2. @ImportResource加载外部定义的额xml文件,通常放在启动类上,需要指定文件的路径和名称。@ImportResource("classpath:beans.xml")
  3. @Configuration自定义配置类,它的作用和xml配置文件是一致的,配置类中使用@Bean注解方法返回的对象都将作为Bean注入到Spring容器中,默认下@Bean注解的方法名就是组件名。

2.7 Spring Boot的Profile多环境配置

  1. 前提:实际开发中,通常需要部署到不同的环境中,对应的配置也是有差别的,需要使用多种环境的配置。
  2. 配置方式
  1. 使用Profile文件进行多环境配置(开发中常用):一般将配置文件放于全局配置的同级,profile文件命名必须满足application-{profile}.yaml或properties
  1. application-dev.yaml(dev环境)、application-uat.yaml(uat环境)、application-pre.yaml(pre环境)、application-prod.yaml(prod环境)
  2. 添加完环境对应的配置文件之后,还需要在全局的配置中激活对应配置文件,在全局的配置上添加:spring.profiles.active=uat
spring:
  profiles:
    active: dev //指向对应的profile
  1. 使用@Profile注解多环境配置:该注解作用于类通过value属性指定配置环境,同样需要在全局中激活。@Profile("dev")

2.8 配置文件中生成随机数设置

  • 语法:${random.xx},xx表示随机数的范围和类型

表达式

描述

${random.value}

随机字符串

${random.int}

随机整数

${random.uuid}

随机的UUID

${random.int(10)}

小于10的整数

${random.int[10,98]}

10--98之间的随机整数

  • 配置文件中参数间的引用
app.name=Jack
app.test=${app.name} is a good student

2.9 Spring Boot异步任务和定时任务

  1. 异步通常使用场景:当同步任务造成响应迟缓的时候,使用异步任务处理。
  2. @Async标注在方法上,表示该方法为异步处理方法同时还需要使用@EnableAsync注解开启异步任务处理,通常标注在项目的启动类上
  3. 使用@Async需注意
  1. 最好配置一个线程池线程复用节省资源
  2. 同一个类中的调用异步处理方法是不起作用的,这种调用本质上是同一个实例的调用,绕过了Spring代理而直接调用@Async注解失效
  1. 定时任务:通常使用@Scheduled(Cron表达式)Spring提供标注在定时任务处理的方法上,同时需要@EnableScheduling注解标注在启动类上开启定时任务的支持。


3、Spring Boot整合MyBatis


3.1 前言

  • Spring Boot没有提供MyBatis场景的依赖,但MyBatis开发团队自己适配了Spring Boot提供了mybatis-spring-boot-starter依赖启动器实现数据库访问的操作。
  • 整合的依赖准备(不是Spring Boot Starter管理的依赖需要指定版本号)
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.16</version>
</dependency>
  • 全局配置中配置连接数据库的一些必要参数
# 这里使用的是MySQL 8.0版本,驱动使用 com.mysql.cj.jdbc.Driver
spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/asset_manage?useSSL=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
      driver-class-name: com.mysql.cj.jdbc.Driver
      username: root
      password: 1234
  • 数据源使用Druid,需要添加配置类注入Spring容器,交由Spring容器管理。
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DataSource getDruid() {
        return new DruidDataSource();
    }
}
  • 定义实体类,与数据库表字段对应
@Data
public class UserInfo {
    private Integer id;
    private String userName;
    private String password;
    private String role;
}
  • MyBatis开启驼峰命名,为了使实体类中userName与数据库中user_name映射,在全局配置(YAML)中配置:
mybatis:
  configuration:
    map-underscore-to-camel-case: true

3.2 整合方式

  1. 使用注解方式整合:定义数据访问层的Mapper接口,在接口上使用@Mapper注解,接口方法上使用@Select、@Insert、@Update、@Delete注解,value值为对应的sql语句,变量使用"#{}"替换
  1. 当Mapper接口过多时,需要多次重复添加@Mapper注解,为了避免重复过多,可以直接在Spring Boot启动类上使用@MapperScan("包路径"),写入具体扫描的包路径。
@Mapper
public interface UserInfoMapper {
    @Select("SELECT id,user_name,password,role FROM user_info WHERE id = #{id}")
    UserInfo getOneInfoById(Integer id);
}
// 启动类使用@MapperScan
@MapperScan("com.lz.learning.mapper")
@SpringBootApplication
public class LearningApplication {
    public static void main(String[] args) {
        SpringApplication.run(LearningApplication.class, args);
    }
}
  1. 使用配置文件方式整合MyBatis
  • 创建对应的Mapper接口,使用@Mapper注解,定义操作方法。
@Mapper
public interface UserInfoMapper {
    UserInfo getOneInfoById(@Param("id") Integer id);
}
  • 创建对应的Mapper XML文件xxMapper.xml一般放在resource目录下的mapper包中,其中namespeace=对应的Mapper接口,文件内实现接口的操作方法。具体语法可查看MyBatis官网:MyBatis中文网
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lz.learning.mapper.UserInfoMapper">
    <select id="getOneInfoById" resultType="UserInfo">
        SELECT id, user_name, `password`, `role`
        FROM user_info
        WHERE id = #{id}
    </select>
</mapper>
  • 全局配置(YAML)中配置xml文件与Mapper接口的映射路径,以便于框架可以扫描到。
mybatis:
  configuration:
    map-underscore-to-camel-case: true //开启驼峰转换
  mapper-locations: classpath:mapper/*.xml //配置映射路径
  type-aliases-package: com.lz.learning.entity //配置别名,指定实体类所在的包,在xml中可以不再使用全路径