美文网首页
Spring Boot 常用技术点

Spring Boot 常用技术点

作者: ariazeng | 来源:发表于2019-02-13 20:05 被阅读0次

    全局捕获异常

    • 现在不管是什么项目,为了项目质量和便于维护,都会加入异常捕获,而Spring Boot 捕获异常更为简单,不废话,上代码。
    @ControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(RuntimeException.class)
        @ResponseBody
        public Map<String, Object> exceptionHandler() {
            Map<String, Object> map = new HashMap<String, Object>();
            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,要先引入依赖。

    <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    

    废话不多说,看代码

    @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<String> 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包

    <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
    </dependency>
    

    大部分使用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 常用技术点

          本文链接:https://www.haomeiwen.com/subject/egnreqtx.html