SpringBoot实用开发
热部署
热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效。但是对配置文件的修改除外!
导入springboot开发者工具坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
激活热部署:ctrl+F9
上面就是一次restart的过程
-
自动启动热部署:
之后:ctrl+alt+shift+/ 之后选择registry
这样之后idea失去焦点5秒后自动构建
设置不参与热部署文件
如何禁用热部署
配置高级
@ConfigurationProperties
ConfigurationProperties可以配置第三方bean属性
如果不第三方属性注入
注入后运行:
//Book就是被注入的类
ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class,args);
Book book = ctx.getBean(Book.class);
System.out.println(book);
宽松绑定
当我们用@ConfigurationProperties来绑定属性时支持属性名宽松绑定,@value就不行
不论大小写,有无下划线,下面面这几种格式都能和上面的属性相匹配
常用计量单位应用
//在利用上面方法注入属性时,1就代表1小时,其他分钟,秒等类似
@DurationUnit(ChronoUnit.HOURS)
private Duration serverTimeOut;
//大小,1代表1字节,其他和上面类似
@DataSizeUnit(DataUnit.BYTES)
private DataSize dataSize;
数据校验
- 开启数据校验有助于系统安全性
-
导入校验需要的坐标
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency>
-
编写
@Component @Data//lombok提供的其中包括get set toString方法等,lombok还提供其他方法具体自行查看 @ConfigurationProperties(prefix = "servers")//注入配置文件中的属性值 @Validated //开启对当前bean的属性注入校验 public class Book { // 定制校验规则,除了下面两个其他如果需要的自行搜索 @Max(value = 8888,message = "最大值不能超过8888") @Min(value = 202,message = "最小值不能小于202") private int id; private String type; private String name; private String description; }
-
使用hibernate框架提供的校验器
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
-
测试
ConfigurableApplicationContext ctx = SpringApplication.run(DemoApplication.class,args); Book book = ctx.getBean(Book.class); System.out.println(book);
-
结果:
另外如果Book类出现
Spring Boot Configuration Annotation Processor not configured 。。但是不影响运行导入这个去掉爆红
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
测试
加载测试专用属性和配置
加载测试专用属性
//properties可以为测试添加临时的属性
//@SpringBootTest(properties ={"test.prop=testValue1"})
//args可以为测试用例添加临时的命令行参数和上面可以达成一样的效果
@SpringBootTest(args = {"--test.prop=testvalye",""})
class DemoApplicationTests {
@Value("${test.prop}")
private String msg;
@Test
void testProperties(){
System.out.println(msg);
}
}
加载测试专用配置
测试类中启动web环境
//参数:NONE-不启动服务器 DEFINED_PORT以默认端口启动服务器(和配置文件中配置的一样)
//RANDOM_PORT以随机端口启动服务器
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class DemoApplicationTests {
@Test
void testProperties(){
}
}
发送虚拟请求
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
class DemoApplicationTests {
@Test
//注入虚拟mvc调用
void testProperties(@Autowired MockMvc mvc) throws Exception {
//http://localhost/books
// 创建模拟请求
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
// 执行对应的请求
mvc.perform(builder);
}
}
匹配响应执行状态
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
class DemoApplicationTests {
@Test
//注入虚拟mvc调用
void testProperties(@Autowired MockMvc mvc) throws Exception {
//http://localhost/books
// 创建模拟请求
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books1");
// 执行对应的请求,返回结果为是否成功的真实值
ResultActions actions = mvc.perform(builder);
// 设置预期值 与真实值进行比较,成功测试通过,失败测试失败
StatusResultMatchers status = MockMvcResultMatchers.status();
// 预计本处调用成功的:状态200
ResultMatcher ok = status.isOk();
// 为本次调用结果设置一个预期值进行匹配
actions.andExpect(ok);
}
}
本处book1导致404,输出结果是:
匹配响应体
和匹配执行状态同理,只不过本处匹配的是return回去的结果
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
//开启虚拟MVC调用
@AutoConfigureMockMvc
class DemoApplicationTests {
@Test
//注入虚拟mvc调用
void testProperties(@Autowired MockMvc mvc) throws Exception {
//http://localhost/books
// 创建模拟请求
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
// 执行对应的请求,返回结果为是否成功的真实值
ResultActions actions = mvc.perform(builder);
ContentResultMatchers content = MockMvcResultMatchers.content();
//如果返回体直接返回的该对象,就是一个json格式,将本处的参数改为需要匹配的json格式就行
ResultMatcher result = content.string("springboot");
actions.andExpect(result);
}
}
匹配响应头
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureMockMvc
class DemoApplicationTests {
@Test
//注入虚拟mvc调用
void testProperties(@Autowired MockMvc mvc) throws Exception {
MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
ResultActions actions = mvc.perform(builder);
HeaderResultMatchers header = MockMvcResultMatchers.header();
//匹配响应头的这个键值对
ResultMatcher result = header.string("Content-Type","application/json");
actions.andExpect(result);
}
}
业务层测试事务回滚
回滚可以实现在测试时不在数据库留下痕迹
@Transaction:表示事务
Rollback 参数true表示启用回滚
测试用例设置随机数据
配置文件中:
testcase:
book: ${random.int}
#限定范围
id: ${random.int(5,10)}
name: ${random.value}
uuid: ${random.uuid}
publishTime: ${random.long}
数据层解决方案一 基于关系型数据库(sql)
springboot默认的数据源
例如:Hikaricp不用导入可以直接在配置文件配置:
JDBCTemplate
标准格式:
配置:
jdbc内置数据库
怎么用不多说
数据层解决方案二 基于非关系型数据库(nosql)
市场常见的nosql解决方案
- Redis
- Mongo
- ES
Redis
基本使用
具体按照启动自己看redis的笔记
一些基本操作:
springboot整合redis
首先在cmd启动redis,然后
也可以不写下面的配置,默认的就是localhost和6379
直接用:
其他方法类似不在多写
上面与客服端操作不等效把RedisTemplate改为StringRedisTemplate就和客户端等效
整合第三方技术
缓存
- 缓存是一种介于数据永久存储介质和数据应用之间的数据临时存储介质
- 使用缓存可以有效的减少低速读取过程的次数(例如磁盘io),提高系统性能
- 缓存不仅可以用于提高永久性介质的数据读取效率,还可以通过临时的数据存储空间
springboot提供了缓存技术,方便缓存使用
-
导入相关坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
-
在启动类加上注解
//开启缓存功能 @EnableCaching
-
在需要用缓存的地方(查询)加上
@Override //设置返回值缓存到value参数名空间中的名和函数参数id相同的位置,下一次在调用且id相同就自己到缓存中拿出 @Cacheable(value = "cacheSpace",key = "#id") public Book getById(Integer id) { return bookDao.selectById(id); }
- springboot除了上面的默认缓存方案外,还可以对其他缓存技术进行整合,统一接口,方便缓存技术的开发和管理,可以整合的技术包括:
任务
-
定时任务是企业级应用中的常见操作
- 年度报表。。
- 。。
-
流行的定时任务技术
- Quartz
- Spring Task
-
相关概念
springboot整合spring tesk
-
在启动类添加注解
//开启定时任务功能 @EnableScheduling
-
在定时任务函数上加上注解
//本处含义为每一秒执行一次任意分钟、小时、天、月,不限情形 @Scheduled(cron = "0/1 * * * * ?") public void print(){ System.out.println("task"); }
如果你想也可以更改关于它的相关配置
整合JavaMail
- SMTP:简单邮件传输协议,用于发送电子邮件的传输协议
- POP3:用于接收电子邮件的标准协议
- IMAP:互联网消息协议,是POP3的替代协议
步骤:
-
导入javamail坐标
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
-
配置相关信息
spring: mail: #邮件供应商smtp协议,qq邮箱来发 host: smtp.qq.com username: 124。。。@qq.com # 不是qq登录密码,是供应商提供的加密后密码 password: 。。。。
获取邮箱加密密码:请求邮箱--设置--账号--点击开启服务会获得授权码就是密码
-
发送邮件
@Service public class SentMailImpl implements SendMailService { //因为已被整合所以自动装配就行 @Autowired private JavaMailSender javaMailSender; // 发送人 private String from = "@qq.com"; // 接收人 private String to ="@163.com"; // 标题 private String subject = "测试邮件"; // 正文 private String context = "正文内容"; @Override public void sendMail() { SimpleMailMessage message = new SimpleMailMessage(); //这样收件人看到的的小蜜蜂发的邮件 // message.setFrom(from+("小蜜蜂")); message.setFrom(from); message.setTo(to); message.setSubject(subject); message.setText(context); // 定时发送 // message.setSentDate(); javaMailSender.send(message); } }
之后在测试类装填调用方法
上面是发送简单文件,发送复杂邮件的方法:
消息
-
企业级应用中广泛使用的三种异步消息传递技术
- JMS
- AMQP
- MQTT
-
JMS
-
AMQP
-
MQTT