SpringBoot工程下Lombok,热部署实现,健康检查,全局异常处理,响应标准

lombok使用步骤:

1.安装lombok插件
2.添加lombok依赖
3.在对应的类上使用lombok提供的注解


lombok提供的注解:

@Data此注解描述类时,在编译时会为此类生成get,set,toString,hashCode,equals等方法
@ToString提供重写的toString方法
@Setter提供set方法
@Getter提供get方法
@Slf4j:lombok发现类上有此注解时,会为此类创建一个日志对象,其变量为log
@AllArgsConstructor提供全参构造函数
@NoArgsConstructor提供无参构造函数


lombok原理:

在java源码编译时,基于lombok做了拦截,底层借助字节码技术为class文件做了增强


lombok的优缺点:

优点:

1.可以自动生成构造方法、get、set等方法。提高了一定的开发效率

2.让代码变得简洁,不用过多的去关注相应的方法

3.属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等

缺点:

1.要求开发者安装对应插件,除了自己要装,协同开发的人也要装插件,这样侵入性很强

2.可读性降低

3.自动生成的代码是在编译时才会产生,那么在开发过程中,就缺失了很多代码。给调试带来了一定问题,比如某个类的get方法被哪些类引用,就很难知道。

4.现JDK版本升级半年就一次,但是lombok作为第三方工具,并且由开源团队维护的,升级速度无法保证,所以,如果我们需要升级到某个新版本的JDK的时候,若其中的特性在Lombok中不支持的话就会受到影响。还有一个可能带来的问题,就是Lombok自身的升级也会受到限制。因为一个应用可能依赖了多个jar包,而每个jar包可能又要依赖不同版本的Lombok,这就导致在应用中需要做版本仲裁,而我们知道,jar包版本仲裁是没那么容易的,而且发生问题的概率也很高。

5.当我们使用@Data定义一个类的时候,会自动帮我们生成equals()方法 。但是如果只使用了@Data,而不使用@EqualsAndHashCode(callSuper=true)的话,会默认@EqualsAndHashCode(callSuper=false),这时候生成的equals()方法只会比较子类的属性,不会考虑从父类继承的属性,无论父类属性访问权限是否开放。这就可能得到意想不到的结果。


热部署实现(动态更新)

在SpringBoot工程中,默认设置了一个监听器,通过监听器监听代码的变化,发现变化后,启动类加载器对变化的类或配置进行重新加载。这个操作相对于重启整个服务器有性能优势,速度更快。


实现步骤

添加依赖:

    
        org.springframework.boot
        spring-boot-devtools
        runtime
    

依赖下载以后,可重启reload项目,然后当我们修改了src/main/java目录下的java文件或修改了src/main/resources目录下的配置文件时,默认都会重启你的web服务器,但是修改了测试类或html文件不会自动重启和部署。


热部署缺点

缺点:占用内存


健康检查

SpringBoot工程中提供了对项目整体运行环境的监控,提供了对Bean对象以及Bean之间依赖关系的检查,提供了Web请求中url映射关系的分析和检查,提供了连接池、线程池、jvm等参数的监控。


健康检查实现

添加依赖:

    
        org.springframework.boot
        spring-boot-starter-actuator
    

启动项目,在浏览器中输入如下地址:(SpringBoot默认打开的监控选项有限)
http://localhost/actuator

假如希望查看更多actuator选项,可以在spring boot中配置文件
application.properties中添加如下语句:

management.endpoints.web.exposure.include=*

然后,重启服务器,基于访问http://localhost/actuator地址...
SpringBoot工程下Lombok,热部署实现,健康检查,全局异常处理,响应标准_第1张图片


全局异常处理

处理规范:

捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常(例如ServiceException)。
捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它的调用者。
最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
避免出现重复的代码(Don’t Repeat Yourself),即DAY原则。

异常处理方式:

1.try{}catch(){} 缺点代码量大,可重复性差,难以维护

2.在Controller类中定义一个或多个异常处理方法
SpringBoot工程下Lombok,热部署实现,健康检查,全局异常处理,响应标准_第2张图片
所有的异常处理方法需要用@ExceptionHandler进行描述,并声明它描述的方法可以处理的异常类型。缺点是只能处理当前Controller类中各个方法出现的RuntimeException异常或者是其子类类型的异常。

3.在控制逻辑层定义全局异常处理类以及异常处理方法

package com.cy.pj.goods.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@Slf4j
@ControllerAdvice//此注解描述的类为全局异常处理类,在此类中可以定义多个异常处理方法
public class GlobalExceptionHandler {
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public JsonResult doHandleRuntimeException(RuntimeException e) {
        log.error("RuntimeException.exception{}",e.getMessage());
        return new JsonResult(e.getMessage());
    }
    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseBody
    public JsonResult doHandleException(IllegalArgumentException e) {
        log.error("IllegalArgumentException.exception{}",e.getMessage());
        return new JsonResult(e.getMessage());
    }
}

如果Controller类中有异常处理方法,那么肯定还是遵循局部优先的原则,由Controller类中的异常处理方法来处理异常。

如果全局异常处理类中存在多个异常处理方法,而其中一个方法的可处理异常的类型是另一个方法的子类类型,那么当出现异常时,则会由这个子类类型的方法来处理


响应标准设计

SpringBoot工程下Lombok,热部署实现,健康检查,全局异常处理,响应标准_第3张图片

你可能感兴趣的:(SpringBoot工程下Lombok,热部署实现,健康检查,全局异常处理,响应标准)