03-知识记录
一.全局异常捕获
@ControllerAdvice 原理还是aop 实现
Spring 框架默认是对RuntimeException 进行事务的回滚,对Exception 的异常不进行事务的回滚
@AutoConfigureMockMvc 可以对Controller 进行测试
MockMvc 类进行模拟发送请求,和对返回结果进行判断
二.mvn 常用命令
1.打包程序,默认会跑所有的单元测试
mvn clean package
打包时,跳过单元测试
mvn clean package -Dmaven.test.skip=true
2.代码中可能由于单元测试、注释(方法中的参数)或者maven javadoc插件的问题导致无法打包,影响工作,为避免这两种情况可以在打包时输入命令:
mvn clean install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true
mvn clean install -Dmaven.test.skip=true -Dfile.encoding=UTF-8 -Dmaven.javadoc.skip=true
-Dmaven.test.skip=true 跳过单元测试
-Dmaven.javadoc.skip=true跳过生成javadoc
3.mvn install
把自定义的maven项目,安装至本地仓库
三.ServletContext
说起ServletContext,一些人会产生误解,以为一个servlet对应一个ServletContext。其实不是这样的,事实是一个web应用对应一个ServletContext,所以ServletContext的作用范围是整个应用,明确这点很重要,这是基础中的基础
四.Spring中实现全局异常
1.自定义一个类,类上添加@ControllerAdvice
2.自定义异常处理方法,方法上添加@ExceptionHandler注解,通过value值指定捕获的异常类型。
例如:
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public ResultDTO handle(Exception e){
if (e instanceof ServerException){
ServerException serverException = (ServerException) e;
log.info("handle----->serviceException:"+serverException.getMessage());
return new ResultDTO(serverException.getCode(), serverException.getMessage());
}else if(e instanceof NullPointerException){
log.info("handle----->nullPointException");
return new ResultDTO(1, e.getMessage());
}else{
log.info("handle-----exception:"+e.getMessage());
return new ResultDTO(ResultCode.UNKNOWN);
}
}
}
五.RequestBodyAdvice 和 ResponseBodyAdvice
使用场景:RequestBodyAdvice一般使用是处理解密json串,而ResponseBodyAdvice是一般使用是处理加密字符串。
RequestBodyAdvice:它可以使用在 @RequestBody 或 HttpEntity 修改的参数之前进行参数的处理,比如进行参数的解密。
需在Controller层中的方法上加上@RequestMapping和@RequestBody;若是没有@RequestBody,
RequestBodyAdvice则不会执行。
ResponseBodyAdvice:在消息体被HttpMessageConverter写入之前允许Controller 中 @ResponseBody修饰的方法
或ResponseEntity调整响应中的内容,比如进行相应的加密。
需在controller层中的方法上加上@RequestMapping和ResponseBody;若是没有@ResponseBody,
ResponseBodyAdvice不会执行。
参考博客:https://blog.csdn.net/weixin_40357412/article/details/102519365
六.Spring中的监听器
应用场景:1.以获取在线用户数量
参考博客:https://blog.csdn.net/taojin12/article/details/88338199
参考博客:https://blog.csdn.net/m0_38075425/article/details/81164501
七.AtomicInteger 的巧用
当在匿名内部内里需要循环维护自增变量遍历一个集合时,可以用AtomicInteger.incrementAndGet 方法;
直接使用int,因为作用域的问题是不行的。
八.SpringBoot 中的事务
1.注解方式实现只要在类上或者方法上添加@Transactional即可
2.Spring默认只对RuntimeException方法的异常进行回滚,比如NullPointException异常;
其他checked方法(编译期异常)不回滚,比如IOException方法,FileNotFoundException异常;
如果要想对checked异常也回滚,需要给@Transactional指定rollbackFor属性,指定回滚的异常。
例如:
@Transactional(rollbackFor = Exception.class)
3.事务方法里,回滚的前提是,方法里的异常一定要抛出去,如果事务方法里自己捕获了异常,
并且没有重新抛出异常,spring框架捕获不到异常,是不会事务回滚的。
一般有2种处理方法:
(1):事务方法里不要捕获异常,直接在方法上抛出,发生异常时有spring框架自己捕获,然后回滚。
(2):事务方法里自己捕获异常,如果需要自己手动回滚可以在catch方法里手动调用:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
作用是告知Spring框架,我需要自己处理异常。
如果捕获了异常,不需要手动回滚,只是记录异常信息,一定重新抛出异常,不然spring框架
捕获不到异常,就不会发生回滚
九.多数据源分布式事务
场景:一个service 方法里,需要调用不同数据源的增删改方法,这时需要多数据源分布式事务,
来保证数据库操作的一致性。
注意:当多数据源的场景出现时,spring自带的@Transactional注解就不能适用,因为不同数据源
需要不同的事务管理器,@Transactional 的value 属性只能指定一个事务管理器。spring 在
执行一个数据源的增删改时,会先开启一个事务,当执行另一个数据源的增删改时,由于spring
默认事务传递机制(如果已经有事务,则沿用之前的事务,否则新开启一个事务)可能存在切换数据源失败问题,
当然这个也可以在@Transactional中通过propagation属性指定,但是多数据源场景时由于各种原因,
可能还是会导致切换数据源失败问题,导致执行另一个数据源操作时失败,所以需要多数据源分布式事务方案。
springboot 中可以使用来完成:可以统一配置全局事务管理器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
十.Spring中的Aop
参考博客:https://blog.csdn.net/qq_38011415/article/details/90578277
Last updated
Was this helpful?