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?