Lombok中@Data等注解的使用,你都了解吗

image.png

在看大牛们的代码时,无意中发现,在一些类的类名上加了@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容