Spring Boot 常用技术点

全局捕获异常

  • 现在不管是什么项目,为了项目质量和便于维护,都会加入异常捕获,而Spring Boot 捕获异常更为简单,不废话,上代码。
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map exceptionHandler() {
        Map map = new HashMap();
        map.put("errorCode", "500");
        map.put("errorMsg", "系統错误!");
        return map;
    }
}
  • 加入一个这样的类,即可捕获运行时的所有异常,如果需要做异常执行更多操作,可以在里面加入日志的操作。
  • @ExceptionHandler(RuntimeException.class)表示拦截异常
  • @ControllerAdvice是Controller的一个辅助类,最常用的就是作为全局异常的切面类
  • @ControllerAdvice可以指定扫描范围
  • @ControllerAdvice约定了几种可行的返回值。如果是直接返回model类的话,需要使用@ResponseBody进行JSON转换。
  • 返回String的话,意思就是表示跳转的某个视图。

AOP统一处理Web请求日志

要在Spring boot 中使用AOP,要先引入依赖。


      org.springframework.boot
      spring-boot-starter-aop

废话不多说,看代码

@Aspect
@Component
public class WebLogAspect {

    private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);

    @Pointcut("execution(public * com.example.controller.*.*(..))")
    public void webLog() {
    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        // 接收到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        // 记录下请求内容
        logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("IP : " + request.getRemoteAddr());
        Enumeration enu = request.getParameterNames();
        while (enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            logger.info("name:{},value:{}", name, request.getParameter(name));
        }
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable {
        // 处理完请求,返回内容
        logger.info("RESPONSE : " + ret);
    }
}

这样的处理,可以记录下每个请求的路径,每个请求设备的IP,每个请求的参数,以及返回结果,都会被日志打印出来,如果不想打印,想存到MongoDB或者Redis或其他上面 ,都是可以的。

SpringBoot使用Lombok做更多事情

先引入jar包


            org.projectlombok
            lombok

大部分使用Lombok的哥们,其实都是在实体类上面贴注解,生产set/get方法,lombok底层就是使用ASM字节码技术,生成set/get方法。(PS:spring boot 对 lombok 有很大的支持,如果要使用Lombok插件,不管是eclipse还是Idea都要先对IDE安装插件)

  • 下面对Lombok常用注解做个总结
@Data 标签,生成getter/setter toString()等方法 
@NonNull : 让你不在担忧并且爱上NullPointerException 
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法 
@Setter/@Getter : 自动生成set和get方法 
@ToString : 自动生成toString方法 
@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现 
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor 
自动生成构造方法 
@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法 
@Value : 用于注解final类 
@Builder : 产生复杂的构建器api类
@SneakyThrows : 异常处理(谨慎使用) 
@Synchronized : 同步方法安全的转化 
@Getter(lazy=true) : 
@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4

ps:在spring boot 中,我个人推荐使用 SLF4J记录日志,直接在类上面贴个`@Slf4j`就可以了

@Async 异步执行方法

如果要使用这个,就要在启动类上添加@EnableAsync,表示开启异步执行,在需要执行的异步方法上加入
@Async就可以,在方法添加了@Async之后,底层使用的还是多线程技术,也就是新开一个线程去调用这个加了注解的方法。

你可能感兴趣的:(Spring Boot 常用技术点)