一、运维实用篇
1.工程的打包与运行
①对SpringBoot项目打包(执行Maven构建指令package)
②运行项目(执行启动指令)
java -jar 工程打包的文件名.jar
jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
注意事项
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
③问题
说明:springboot_08_ssmp-0.0.1-SNAPSHOT.jar中没有主清单属性
将pom.xml中的plugin中的mainclass中的skip属性删除
跳过测试过程(蓝色闪电)
2.打包插件
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.zhou.SSMPApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
jar包描述文件
3.Boot工程快速启动(Linux版)
4.配置高级
①临时属性设置
②在idea中测试临时属性
//可以在启动boot程序时断开读取外部临时配置对应的入口,也就是去掉读取外部参数的形参
//SpringApplication.run(SSMPApplication.class);
③配置文件的4级分类
1级:file: config/application.yml
2级:file:application.yml
3级:classpath:config/application.yml
4级:classpath:application.yml
④自定义配置文件
i.在Program arguments中
指定文件名:
--spring.config.name=ebank(配置文件名)
或指定文件路径:
--spring.config.loation=classpath:/ebank.yml(文件的全类名)
5.多环境开发
①yaml版
#应用环境
#会加载一些默认环境,公共配置
spring:
profiles:
active: pro
---
#设置环境
#区分这几个环境,通过spring.profiles起名字来区分
#生产环境
spring:
config:
activate:
on-profile: pro
server:
port: 80
---
#开发环境
spring:
config:
activate:
on-profile: dev
server:
port: 81
---
#测试环境
spring:
config:
activate:
on-profile: test
server:
port: 82
小结:设置多环境使用---区分环境设置边界
多环境开发多文件版
主配置文件中设置公共配置,环境分类配置文件中常用于设置冲突属性
②多环境开发多文件版(properties版)
注:properties文件多环境配置仅支持多文件格式
③多环境开发分组管理
后加载的覆盖前面加载的相同配置
版本升级后,用group替代include,定义了若干个环境组
spring:
profiles:
active: dev
group:
"dev": devDB,devMVC
"pro": proDB,proMVC
但其配置顺序也发生了变化。
dev,devDB,devMVC
④多环境开发控制
以maven配置为主,让springboot读取maven的配置
pom中定义了多环境,且在多个环境中都定义了profile.active的变量
springboot中引用maven属性
用@profile.active@
6.日志
①日志基础操作
在application.yml中设置
debug: true即可开启debug日志
i.在代码中使用日志工具记录日志
package com.zhou.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController {
// 创建记录日志的对象
private static final Logger log= LoggerFactory.getLogger(BookController.class);
@GetMapping
public String getById(){
System.out.println("springboot is a running...");
log.debug("debug...");
log.info("info...");
log.warn("warn...");
log.error("error...");
return "springboot is a running...";
}
}
ii.设置日志输出级别
root表示根节点,即整体应用日志级别
logging:
level:
root: debug
升级版
logging:
# 设置分组
group:
ebank: com.zhou.controller
iservice: com.alibaba
# 整体的日志级别为info
level:
root: info
# 设置分组,对某个组设置日志级别
ebank: warn
②快速创建日志对象
③日志输出格式控制
pattern:
console: "%d %clr(%5p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"
④文件记录日志
设置日志文件(日志如何记录到文件里)
file:
name: server.log
设置日志文件的详细配置(滚动日志)
file:
name: server.log
logback:
rollingpolicy:
# 设置文件的大小
max-file-size: 3KB
# 设置文件的命名格式
file-name-pattern: server.%d{yyyy-MM-dd}.%i.log
%d:日期
%i:相当于循环变量i,从0开始
二、开发实用篇(能够基于springboot整合任意第三方技术)
1.热部署
服务器不用启动,修改完立马出效果=》热部署
①手动启动热部署
在pom.xml中添加开启开发者工具的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
激活热部署:Ctrl+F9(或点击idea中的Build中的Build project进行激活)
补充:关于热部署
重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器
重载(ReLoad):jar包,加载位置base类加载器
注:热部署仅仅加载当前开发者自定义的资源,不加载jar资源
②自动启动热部署
设置自动构建项目
ctrl+ALT+shift+/:打开如下图Register
激活方式:idea失去焦点5秒后启动热部署
③热部署范围配置
热部署属于devtools jar包给我们带来的功能,隶属于springboot,
要修改热部署的范围即设置spring boot相关的操作
自定义设置不参与重启排除项:
devtools:
restart:
# 设置不参与热部署的文件或者文件夹,文件夹就用/**
exclude: static/**,public/**,config/application.yml
④关闭热部署功能
只在开发环境下有效
当前操作可将热部署彻底关闭(设置高优先级的属性禁用热部署)
2.配置高级
自定义配置bean(先在yml中配置属性,再创建一个相关的配置类,最后通过容器获取bean)
①第三方bean属性绑定
使用@ConfigurationProperties为第三方bean绑定属性
application.yml
datasource:
driverClassName: com.mysql.jdbc.Driver123
注:@EnableConfigurationProperties(ServerConfig.class),与ServerConfig类下的注解@Component冲突,不可同时使用
@ConfigurationProperties与@EnableConfigurationProperties的区别
@ConfigurationProperties:具体做属性绑定
@EnableConfigurationProperties:开启属性绑定,并设定对应的目标是谁,可以将使用@ConfigurationProperties注解对应的类加入Spring容器
解除使用@ConfigurationProperties注释警告
②松散绑定
@ConfigurationProperties绑定属性支持属性名宽松绑定
servers:
# ipAddress: 192.168.0.1
# ipAddress: 192.168.0.1 驼峰
# ip_address: 192.168.0.1 underline
ip-address: 192.168.0.1 # 烤肉串模式
# IP_ADDRESS: 192.168.0.1 常量模式
注:
1.宽松绑定不支持注解@Value引用单个属性的方式
2.绑定前缀名命名规范:仅能使用纯小写字母,数字,下划线作为合法的字符
③常用计量单位的应用
springboot支持JDK8提供的时间与空间计量单位
@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
private String ipAddress;
private int port;
private long timeout;
//时间单位
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut;
//存储空间单位
@DataSizeUnit(DataUnit.MEGABYTES)
private DataSize dataSize;
④bean属性校验
<!-- 导入JSR303规范-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<!-- <version>2.0.1.Final</version>-->
</dependency>
<!-- 使用hibernate框架提供的校验器作实现类-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
对bean开启校验功能
//2.开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
private String ipAddress;
// 设置具体的规则
@Max(value = 8888,message = "最大值不能超过8888")
private int port;
⑤进制数据转换规则
yml中int 支持二进制,八进制和十六进制
八进制:0(0-7)
十六进制:0x(0-9,a-f)
注:如需使用字符串请使用引号明确标注
3.测试
①加载测试专用属性
在测试类中(args与properties同时使用时,args级别更高)
//properties属性可以为当前测试用例添加临时的属性配置
//@SpringBootTest(properties = {"test.prop=testValue"})
//args属性可以为当前测试用例添加临时的命令行参数,该参数也可以覆盖配置的属性
@SpringBootTest(args={"--test.prop=testValue1"})
②加载测试专用配置
使用@Import注解加载当前测试类专用配置
③测试类中启动web环境
数据层,业务层都可做测试,表现层也可以
在pom.xml中配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
在测试类中模拟端口
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)//随机端口
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)//默认端口
public class WebTest {
@Test
void test(){
}
}
④发送虚拟请求
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)//随机端口
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)//默认端口
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
@Test
// 注入虚拟MVC调用对象
void test(@Autowired MockMvc mvc) throws Exception {
// 创建虚拟请求,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
ResultActions actions=mvc.perform(builder);
}
⑤匹配响应执行状态
@Test
// 注入虚拟MVC调用对象
void testStatue(@Autowired MockMvc mvc) throws Exception {
// 创建虚拟请求,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
ResultActions actions=mvc.perform(builder);
// 设置预期响应值与真实值进行比较
// 定义本次测试的预期值
StatusResultMatchers status = MockMvcResultMatchers.status();
// 预计本次成功的状态
ResultMatcher ok = status.isOk();
// 添加预计值到本次调用过程中进行匹配
actions.andExpect(ok);
⑥匹配响应体
// 匹配执行结果
@Test
// 注入虚拟MVC调用对象
void testBody(@Autowired MockMvc mvc) throws Exception {
// 创建虚拟请求,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
ResultActions actions=mvc.perform(builder);
ContentResultMatchers content = MockMvcResultMatchers.content();
ResultMatcher resultMatcher = content.string("springboot");
actions.andExpect(resultMatcher);
}
⑦匹配响应体(JSON)
与匹配响应体只有一点区别
⑧匹配响应头
@Test
// 注入虚拟MVC调用对象
void testHeader(@Autowired MockMvc mvc) throws Exception {
// 创建虚拟请求,当前访问/books
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
ResultActions actions=mvc.perform(builder);
HeaderResultMatchers header = MockMvcResultMatchers.header();
ResultMatcher string = header.string("Content-Type", "application/json");
actions.andExpect(string);
}
⑨业务层测试回滚
业务层测试过后会留下数据,最好不要把数据装到数据库里。
为测试用例添加事务,springboot会对测试用例对应的事务提交操作进行回滚
@SpringBootTest
@Transactional
public class DaoTest {
@Autowired
private BookService bookService;
⑩测试用例设置随机数据
testcase:
book:
id: ${random.int}
name: ${random.value}
uuid: ${random.uuid}
publishTime: ${random.long}
4.数据层解决方案
(1)SQL
①数据源配置
springboot提供了3种内嵌的数据源对象供开发者选择。
HikariCP(默认)url放在hikari外部
Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象。
Commons DBCP:HikariCP不可用,tomcat数据源也不可用
Durid
#spring:
# datasource:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
# username: root
# password: 123456
# type: com.alibaba.druid.pool.DruidDataSource
Hikari
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
hikari:
username: root
password: 123456
基本
#spring:
# datasource:
# druid:
# driver-class-name: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://localhost:3306/ssm
# username: root
# password: 123456
②持久化技术(jdbcTemplate)
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
void testJdbcTemplate(){
String sql ="select * from tbl_book where id=1";
// List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
// System.out.println(maps);
RowMapper<Book> rm=new RowMapper<Book>() {
@Override
public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
Book temp=new Book();
temp.setId(rs.getInt("id"));
temp.setName(rs.getString("name"));
temp.setType(rs.getString("type"));
temp.setDescription(rs.getString("description"));
return temp;
}
};
List<Book> list = jdbcTemplate.query(sql, rm);
System.out.println(list);
}
要用jdbcTemplate需要导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
jdbcTemplate配置
spring:
jdbc:
template:
query-timeout: -1 #查询超时时间
max-rows: 500 #最大行数
fetch-size: -1 #缓存行数
③内置数据库
SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率
H2
HSQL
Derby(都是拿Java语言写的)
导入H2相关的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能。(enabled: false)
# h2数据库
server:
port: 80
spring:
h2:
console:
enabled: true
path: /h2
datasource:
url: jdbc:h2:~/test1
hikari:
driver-class-name: org.h2.Driver//可不写
username: sa
password: 123456
(2)NoSQL
redis是一款key-value存储结构的内存级NoSQL数据库。
①redis里面在cmd中的清屏指令是clear。
key中镶嵌key-value
②idea中操作redis(springboot整合Redis)
先导入坐标,再安装yml配置,最后自动装配一个redisTemplate对象。
RedisTemplate提供操作各种数据存储类型的接口API:
③springboot读写Redis的客户端
客户端:StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效
@SpringBootTest
public class StringRedisTemplateTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
void get(){
ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
String name = ops.get("name");
System.out.println(name);
}
④springboot操作Redis客户端实现技术切换(jedis)
导入依赖坐标
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
配置客户端(默认lettuce)
spring:
redis:
host: localhost
port: 6379
client-type: jedis