美文网首页文字欲IT@程序员猿媛SpringBoot精选
Lombok中@Data等注解的使用,你都了解吗

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

作者: 程就人生 | 来源:发表于2019-11-13 21:36 被阅读0次
    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

    相关文章

      网友评论

        本文标题:Lombok中@Data等注解的使用,你都了解吗

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