在看大牛们的代码时,无意中发现,在一些类的类名上加了@Data、@Slf4j的注解;据说加了这些注解后,就无需再写get、set方法了,能省一点是一点;@Slf4j这个注解又有什么用呢,带着好奇心,来体验一把。
二话不说,找了一个实体类,加上@Data、@Slf4j的注解,不是说好省代码的吗?怎么还报上错了,需要引入架包吗?果真,需要引入lombok架包,这两个注解都是属于lombok架包的;
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
<scope>provided</scope>
</dependency>
引入了架包,是否就可以用了呢,事实证明还不行,还是报错,好吧,还需要安装lombok的插件;最简单的是手动安装,把maven本地仓库里的lombok架包拷贝到开发工具的安装目录下,然后用管理员的身份进入安装路径,运行安装命令:
安装命令
java -jar lombok-1.18.8.jar
这时,会弹出一个红辣椒的对话框,选择安装目录(可以多选),点击安装按钮即可;
安装对话框 安装成功
在开发工具的目录下,可以看到生成了一个lombok.jar包,那便是安装的结果,打开后缀为.ini的配置文件,也可以看到配置文件中的变化。
配置文件中,多了一行lombok的配置。
-javaagent:C:\sts-3.8.3.RELEASE\lombok.jar
安装过后,重启开发工具,就可以使用lombok中的注解了。下面写个类简单的测试一下吧。
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* lombok注解的使用
* @author 程就人生
* @date 2019年11月13日
*/
@Slf4j
@Data
public class User {
private String username;
private String password;
private byte sex;
public static void main(String[] argo){
User user = new User();
user.setUsername("aaaa");
user.setPassword("123456");
user.setSex((byte) 1);
log.info(user.getUsername());
log.info(user.getPassword());
log.info(user.getSex()+"");
}
}
运行一下,完全正常,运行结果如下:
20:34:52.977 [main] INFO com.example.demo.entity.User - aaaa
20:34:52.981 [main] INFO com.example.demo.entity.User - 123456
20:34:52.981 [main] INFO com.example.demo.entity.User - 1
通过上面的结果,没有get、set的方法,整体看上去,确实简洁了不少。只是加了两个注解,就可以少写那么多的代码,背后到底发生了什么呢?
点击@Slf4j,查看它的源码,可以发现,@Slf4j已经帮我们生成了那长长的一句,不需要我们自己写,我们自己使用log调用其下面的方法就可以了。
@Slf4j部分源码
点击@Data,查看它的源码,可以发现,一个@Data的功能多多,加了这一个注解,相等于加了@Getter、@Setter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode五个注解,功能真是强大。
@Data部分源码
现在,再把这几个注解罗列一下,明确它们的含义:
@Setter 注解在类或字段,注解在类时为所有字段生成setter方法,注解在字段上时只为该字段生成setter方法。
@Getter 使用方法同上,区别在于生成的是getter方法。
@ToString 注解在类,添加toString方法。
@EqualsAndHashCode 注解在类,生成hashCode和equals方法。
@NoArgsConstructor 注解在类,生成无参的构造方法。
@RequiredArgsConstructor 注解在类,为类中需要特殊处理的字段生成构造方法,比如final和被@NonNull注解的字段。
@AllArgsConstructor 注解在类,生成包含类中所有字段的构造方法。
@Data 注解在类,生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Slf4j 注解在类,生成log变量,严格意义来说是常量。
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
在上面的测试代码中,再加点代码:
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
/**
* lombok注解的使用
* @author 程就人生
* @date 2019年11月13日
*/
@Slf4j(topic="程就人生")
@Data
public class User {
private String useruid;
private String username;
private String password;
private byte sex;
//加了final修饰
private final int status;
public static void main(String[] argo){
User user = new User(1);
user.setUseruid("1");
user.setUsername("aaaa");
user.setPassword("123456");
user.setSex((byte) 1);
log.info(user.getUseruid());
log.info(user.getUsername());
log.info(user.getPassword());
log.info(user.getSex()+"");
//toString
log.info("@ToString:" + user.toString());
User user1 = new User(1);
user1.setUseruid("1");
user1.setUsername("bbb");
user1.setPassword("123456");
user1.setSex((byte) 1);
log.info("@EqualsAndHashCode:" + user.hashCode());
log.info("@EqualsAndHashCode:" + user.equals(user1));
log.info("" + user.canEqual(user1));
}
}
测试结果如下:
21:30:49.681 [main] INFO 程就人生 - 1
21:30:49.684 [main] INFO 程就人生 - aaaa
21:30:49.684 [main] INFO 程就人生 - 123456
21:30:49.684 [main] INFO 程就人生 - 1
21:30:49.684 [main] INFO 程就人生 - @ToString:User(useruid=1, username=aaaa, password=123456, sex=1, status=1)
21:30:49.684 [main] INFO 程就人生 - @EqualsAndHashCode:-1028463405
21:30:49.684 [main] INFO 程就人生 - @EqualsAndHashCode:false
21:30:49.684 [main] INFO 程就人生 - true
日志的注解,除了@Slf4j,还有很多可以使用,比如:@CommonsLog、@Log、@Flogger、@JBossLog、@Log、@Log4j、@Log4j2、@XSlf4j等等,每个log注解后面都对应一种log类;具体的,可以参考官方文档:
https://projectlombok.org/features/log
通过这个demo,通过这两个看似简单的注解,挖出了后面的lombok框架;想使用这两个注解,仅仅引入limbok的架包还是不够的,还需给开发工具安装插件。
使用了这两种注解后,get、set还有其他的一些方法是在何时生成的呢,会不会影响代码运行的性能呢?下面这些是摘抄,仅供参考:
在JDK1.5有了注解的同时,也引入了两种解析方式,一种是运行时解析,一种是编译时解析。
运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射拿到该注解。java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口。
编译时解析又有两种机制,一种是APT(Annotation Processing Tool),另一种是Pluggable Annotation Processing API。lombok本质上就是一个实现了“JSR 269 API”的程序。项目里到底可不可以用lombok来省点力气呢,还是根据自己的实际情况吧。
lombok官网:https://www.projectlombok.org/
参考资料:https://blog.csdn.net/ThinkWon/article/details/101392808
https://blog.csdn.net/longloveqing/article/details/81539749
网友评论