1、初识Spring Boot框架
1.1 Spring Boot框架定义
Spring Boot并不是替代Spring框架的解决方案,而是和Spring框架紧密结合用于提升Spring开发者体验的工具,同时Spring Boot还集成了大量常用的第三方库配置,本质上是基于Spring的Web应用程序开发框架。
1.2 Spring Boot框架的优点
- 可快速构建独立的Spring应用,依靠大量的注解实现自动化配置的全新框架。
- 易于部署:内嵌了Tomcat、Jetty和Undertow服务器,自动将项目打包,并在项目运行时部署到服务器中。
- 简化配置:通过自动配置和starter依赖的方式,简化了Maven配置。
- 自动配置:根据当前类路径下的类jar包来自动配置bean。
- 提供生产就绪功能:健康检查、外部化配置、安全管理。
- 极少的代码生成和xml配置:使用大量的注解完成。
1.3 Spring Boot主要的三个依赖
spring-boot-starter-parent
:Spring Boot框架集成项目的统一父类管理依赖。
- 如果在pom.xml文件中引入的依赖不是spring-boot-starter-parent所管理的,需要在引入依赖时指定对应的版本号,使用版本号标签。
spring-boot-devtools
:实现Spring Boot的热部署,即每次修改不需要重新启动项目。spring-boot-starter-web
:提供web开发场景所需要的底层所有依赖文件,也对版本作了统一管理。
1.4 关于@SpringBootApplication和@RestController注解
@RestController
:它是@ResponseBody+@Controller的组合注解。标注在Controller类上,它会将类作为Controller层加到Spring容器中,同时该类的方法无法返回JSP页面,而且会返回JSON格式的字符串。@SpringBootApplication
:Spring Boot的核心注解,标注在启动类上,是启动类的入口。main方法中调用SpringApplication.run(启动类.class, args)
以此来启动Spring Boot。它也是一个组合注解,包括:
@SpringBootConfiguration
:可以被组件扫描器扫描的配置类,内部包含了@Configuration注解。@EnableAutoConfiguration
:开启自动配置的功能,实现自动化配置。内部由两个核心注解组成:@AutoConfigurationPackage+@Import。获取项目主程序启动类所在的根目录,从而指定后续组件要扫描的包位置。@ComponentScan
:组件包扫描器,用于将指定包中的注解自动装配到Spring的Bean容器中。
1.5 Spring Boot自动配置的原理
- 注解@EnableAutoConfiguration、@Configuration、@ConditionalOnClass就是自动配置的核心。
- @EnableAutoConfiguration给容器导入META-INF/spring.factories里定义的自动配置类,筛选有效的自动配置类,每一个自动配置类结合对应的xxxProperties.java读取配置文件进行自动配置功能。
1.6 Spring Boot执行流程
- SpringApplication实例的初始化。
- 项目的初始化启动,调用run方法。
- 运行Soring Boot的方式
- 打包命令或放到容器中运行
- 用Maven插件运行
- 直接执行main方法执行
1.7 Spring Boot打成的jar和普通的jar有什么区别
- Spring Boot项目最终打包成的jar是可执行jar ,这种jar可以直接通过java -jar xxx.jar命令来运行,这种jar不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。
- Spring Boot的jar无法被其他项目依赖,主要还是它和普通jar的结构不同。普通的jar包,解压后直接就是包名,包里就是我们的代码,而Spring Boot打包成的可执行jar解压后,在\BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在pom.xml文件中增加配置,将Spring Boot项目打包成两个jar,一个可执行,一个可引用。
1.8 JavaWeb、Spring、Spring MVC和Spring Boot有什么区别,都是做什么用的
- JavaWeb是Java语言的Web开发技术,主要用于开发Web应用程序,包括基于浏览器的客户端和基于服务器的Web服务器。
- Spring是一个轻量级的开源开发框架,主要用于管理Java应用程序中的组件和对象,并提供各种服务,如事务管理、安全控制、面向切面编程和远程访问等。它是一个综合性框架,可应用于所有类型的Java应用程序。
- Spring MVC是Spring框架中的一个模块,用于开发Web应用程序并实现 MVC(模型-视图-控制器)设计模式,它将请求和响应分离,从而使得应用程序更加模块化、可扩展和易于维护。
- 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.properties或application.yaml文件作为全局的配置文件,properties的优先级高于yaml文件的优先级。
配置加载顺序:properties > yaml > 系统环境变量 > 命令行参数
2.2 properties和yaml格式的使用
- properties
- 简介:定义Spring Boot项目相关属性,可以是系统属性、环境变量、命令参数等信息。启动时会自动加载全局配置文件。
# application.properties
server.address=80
server.port=8081
- 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配置的优势
- 配置有序
- 简洁明了,支持数组
- 缺陷:不支持@PropertySource注解导入的自定义yaml文件。
2.3 配置文件属性值的注入
- @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;
}
- @Value:用来读取配置文件中的属性值,并逐个注入Bean对象的对应属性中。使用@Value注入的属性类型只能是普通数据类型(数字、字符串、布尔等),语法:
@Value("${属性}")
@Value("${person.id}")
private Integer id;
2.4 @ConfigurationProperties和@Value注解的区别
- 底层框架:@ConfigurationProperties注解是Spring Boot框架自带的,@Value注解是Spring框架支持的。
- 功能:@ConfigurationProperties注解能够将配置文件的属性值批量注入Bean对象,而@Value只能单个注入。
- 属性的setter方法:@ConfigurationProperties进行属性值注入时,Bean中必须有对应属性的setter方法,若没有,则属性值为空,@Value不需要setter方法,它会先读取配置中的值,然后自动注入到属性中。
- 复杂类型属性注入:@ConfigurationProperties支持任意数据类型的属性注入,而@Value只能注入普通的数据类型。
- EL表达式:@Value支持此表达式,@ConfigurationProperties不支持。
@Value("#{5*2}")
2.5 @ConfigurationProperties和@Value注解的使用场景
- 如果只是针对某一个业务需求,需要引入配置文件中的个别属性值,使用@Value注解。
- 如果针对某个JavaBean类,需要批量引入配置文件中属性值,使用@ConfigurationProperties注解。
@Bean
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource getDruid() {
return new DruidDataSource();
}
2.6 Spring Boot导入自定义配置文件
- @PropertySource:加载自定义配置文件,指定文件的位置和名称。
@PropertySource("classpath:test.properties")
,该注解不支持导入yaml类型文件。 - @ImportResource:加载外部定义的额xml文件,通常放在启动类上,需要指定文件的路径和名称。
@ImportResource("classpath:beans.xml")
- @Configuration:自定义配置类,它的作用和xml配置文件是一致的,配置类中使用@Bean注解方法返回的对象都将作为Bean注入到Spring容器中,默认下@Bean注解的方法名就是组件名。
2.7 Spring Boot的Profile多环境配置
- 前提:实际开发中,通常需要部署到不同的环境中,对应的配置也是有差别的,需要使用多种环境的配置。
- 配置方式
- 使用Profile文件进行多环境配置(开发中常用):一般将配置文件放于全局配置的同级,profile文件命名必须满足
application-{profile}.yaml或properties
- application-dev.yaml(dev环境)、application-uat.yaml(uat环境)、application-pre.yaml(pre环境)、application-prod.yaml(prod环境)
- 添加完环境对应的配置文件之后,还需要在全局的配置中激活对应配置文件,在全局的配置上添加:
spring.profiles.active=uat
spring:
profiles:
active: dev //指向对应的profile
- 使用@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异步任务和定时任务
- 异步通常使用场景:当同步任务造成响应迟缓的时候,使用异步任务处理。
- @Async:标注在方法上,表示该方法为异步处理方法同时还需要使用@EnableAsync注解开启异步任务处理,通常标注在项目的启动类上。
- 使用@Async需注意
- 最好配置一个线程池,线程复用节省资源
- 在同一个类中的调用异步处理方法是不起作用的,这种调用本质上是同一个实例的调用,绕过了Spring代理而直接调用,@Async注解失效。
- 定时任务:通常使用
@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 整合方式
- 使用注解方式整合:定义数据访问层的Mapper接口,在接口上使用@Mapper注解,接口方法上使用@Select、@Insert、@Update、@Delete注解,value值为对应的sql语句,变量使用"#{}"替换。
- 当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);
}
}
- 使用配置文件方式整合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中可以不再使用全路径
标签:配置文件,必知,Spring,配置,Boot,注解,属性
From: https://blog.51cto.com/u_16446487/8945970