一,Lombok
Lombok对代码在内存中进行整合,提供了实体类的get/set方法自生成和类日志的快捷处理方式。使代码更加简洁
二,使用Lombok前实体代码和业务代码
* 从代码中可以看到日志声明和实例声明都需要手动处理,
package com.gupao.springboot.test.controller;
import com.alibaba.fastjson.JSONObject;
import com.gupao.springboot.test.entitys.UserVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author pj_zhang
* @create 2018-12-23 23:06
**/
@RestController
public class ErrorController {
private Logger logger = LoggerFactory.getLogger(ErrorController.class);
@RequestMapping("/user")
public UserVO calculate(String name, Integer age) {
UserVO userVO = new UserVO();
userVO.setName(name);
userVO.setAge(age);
logger.info(JSONObject.toJSONString(userVO));
return userVO;
}
}
package com.gupao.springboot.test.entitys;
/**
* @author pj_zhang
* @create 2018-12-24 21:18
**/
public class UserVO {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "UserVO{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
三,使用Lombok进行处理
1,引入Lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
,2,去除VO类的get/set方法,添加Lombok注解,查看业务类,发现并没有生效,这是因为没有添加Lombok插件
package com.gupao.springboot.test.entitys;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @author pj_zhang
* @create 2018-12-24 21:18
**/
@Setter
@Getter
@ToString
public class UserVO {
private String name;
private Integer age;
}
3,安装Lombok插件(以IDEA进行演示)
* File --> Settings -->Plugins
* 点击上图中圈出来的Browers repositories,进入弹出页面后搜索Lambok,点击Instanll按钮进行安装(此处已经安装完成),安装完成暂时不要重启;右下方圈出来区域表示Lombok支持的注解,其中包括实体类需要的set/get/equals/hashcode/toString/构造器,以及业务类需要的日志,具体可点击进入官网进行查看:https://projectlombok.org/features/all
* File --> Settings -->Plugins,上一步安装成功后,在此处可以查到lombok插件
* File --> Settings -->Build,Execution --> Compiler --> Annotation Processors,选中标中区域后重启IDEA
4,重新使用Lombok注解进行代码简化处理
* 实体类
package com.gupao.springboot.test.entitys;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
/**
* @author pj_zhang
* @create 2018-12-24 21:18
**/
// get方法
@Setter
// set方法
@Getter
// 使用日志注解, 反编译class文件展示logger效果
@Slf4j
public class UserVO {
private String name;
private Integer age;
@Override
public String toString() {
log.info(name + "------" + age);
return name;
}
}
* 业务类
package com.gupao.springboot.test.controller;
import com.alibaba.fastjson.JSONObject;
import com.gupao.springboot.test.entitys.UserVO;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author pj_zhang
* @create 2018-12-23 23:06
**/
@RestController
// Lombok自带的日志注解
@Slf4j
public class ErrorController {
@RequestMapping("/user")
public UserVO calculate(String name, Integer age) {
UserVO userVO = new UserVO();
userVO.setName(name);
userVO.setAge(age);
// 不用定义logger, 直接通过log进行调用
log.info(JSONObject.toJSONString(userVO));
return userVO;
}
}
* 测试结果,从下图中可以看到,程序正常运行,而代码已经通过Lambok有所精简
* 通过反编译class文件查看通过Lombok处理后的实体类
-- 从下面文件中可以看到,Lombok的@Setter和@Getter注解已经对全部属性生成了get/set方法,@Slf4j注解也对应生成了log4j包下的日志对象Logger,整体生成的字节码文件与全部手写生成的实体类完全一致
-- 正因为编译后的class文件与不使用Lambok进行处理的文件内容完全一致,所以在生产环境不需要使用Lambok插件对其进行支持,因为Lambok只是在开发阶段简化开发的工具插件,而生产环境则是对class文件进行部署。
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.gupao.springboot.test.entitys;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserVO {
private static final Logger log = LoggerFactory.getLogger(UserVO.class);
private String name;
private Integer age;
public UserVO() {
}
public String toString() {
log.info(this.name + "------" + this.age);
return this.name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return this.name;
}
public Integer getAge() {
return this.age;
}
}