|
| 1 | +--- |
| 2 | +title: 如何使用 Lombok 进行优雅的编码 |
| 3 | +date: 2018-12-30 00:08:10 |
| 4 | +url: develop/tool-Lombok |
| 5 | +tags: |
| 6 | + - Lombok |
| 7 | + - 开发工具 |
| 8 | +categories: |
| 9 | + - 生产工具 |
| 10 | +--- |
| 11 | + |
| 12 | +Project Lombok 是一个 java 库,它可以通过注解自动为你要编写的类添加相应功能,如 get/set 方法,提高了开发效率。 |
| 13 | + |
| 14 | +引入 POM 依赖。 |
| 15 | + |
| 16 | +```xml |
| 17 | +<!-- Lombok核心依赖 --> |
| 18 | +<dependency> |
| 19 | + <groupId>org.projectlombok</groupId> |
| 20 | + <artifactId>lombok</artifactId> |
| 21 | + <version>1.18.4</version> |
| 22 | + <scope>provided</scope> |
| 23 | +</dependency> |
| 24 | +<!-- 添加logback日志框架支持,(可有可无) --> |
| 25 | +<dependency> |
| 26 | + <groupId>ch.qos.logback</groupId> |
| 27 | + <artifactId>logback-classic</artifactId> |
| 28 | + <version>1.0.6</version> |
| 29 | +</dependency> |
| 30 | +``` |
| 31 | +<!-- more --> |
| 32 | + |
| 33 | +查看依赖关系可以发现 `logback-classic` 依赖了 `SLF4J-API` 日志门面以及 l`ogback-core` 日志实现框架。 |
| 34 | + |
| 35 | + |
| 36 | +关于日志注解的选择,可以参考[官方文档](https://www.projectlombok.org/features/log)。默认的日志输出注释类为被注释的类路径,也可以使用 topic 参数自定义,如`@Slf4j(topic="reporting")`. 一般我们都会选择 `@Slf4j` 这个日志抽象类。在使用这个注解的时候需要导入 SLF4-API 抽象层以及具体的日志实现框架,上方的依赖中我们已经添加了日志依赖。 |
| 37 | + |
| 38 | +```java |
| 39 | +@CommonsLog |
| 40 | +Creates private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class); |
| 41 | +@Flogger |
| 42 | +Creates private static final com.google.common.flogger.FluentLogger log = com.google.common.flogger.FluentLogger.forEnclosingClass(); |
| 43 | +@JBossLog |
| 44 | +Creates private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class); |
| 45 | +@Log |
| 46 | +Creates private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName()); |
| 47 | +@Log4j |
| 48 | +Creates private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class); |
| 49 | +@Log4j2 |
| 50 | +Creates private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class); |
| 51 | +@Slf4j |
| 52 | +Creates private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class); |
| 53 | +@XSlf4j |
| 54 | +Creates private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class); |
| 55 | +``` |
| 56 | +`Lombok` 的使用主要是几个注解,下面介绍常用的几个注解。 |
| 57 | + |
| 58 | +`@Getter/@Setter` 为属性生成 get 和 set 方法。 |
| 59 | + |
| 60 | +`@ToString` 生成 toString 方法,输出各个属性值。 |
| 61 | + |
| 62 | +`@EqualsAndHashCode` 生成 equals 和 hashCode 方法。 |
| 63 | + |
| 64 | +`@NoArgsConstructor` 生成无惨构造器。 |
| 65 | + |
| 66 | +`@AllArgsConstructor` 生成全参数构造器。 |
| 67 | + |
| 68 | +`@Data` 是一个方便注解,它捆绑了 `@ToString` `@Getter/@Setter` `@EqualsAndHashCode` 以及 `@RequiredArgsConstructor`. |
| 69 | + |
| 70 | +根据上面的解释,用下面的一个例子演示用法。 |
| 71 | + |
| 72 | +```java |
| 73 | +import lombok.*; |
| 74 | +import lombok.extern.slf4j.Slf4j; |
| 75 | + |
| 76 | +/** |
| 77 | + * <p> |
| 78 | + * Lombok使用 |
| 79 | + * |
| 80 | + * @Author niujinpeng |
| 81 | + * @Date 2018/12/10 11:05 |
| 82 | + */ |
| 83 | +@Slf4j(topic = "Lombok") |
| 84 | +public class LombokTest { |
| 85 | + |
| 86 | + public static void main(String[] args) { |
| 87 | + Person person1 = new Person(); |
| 88 | + person1.setName("Darcy"); |
| 89 | + person1.setAge(22); |
| 90 | + person1.setTeacher(true); |
| 91 | + log.info(person1.toString()); |
| 92 | + |
| 93 | + Person person2 = new Person("Darcy", 22, true); |
| 94 | + log.info(person2.toString()); |
| 95 | + |
| 96 | + boolean equals = person1.equals(person2); |
| 97 | + log.info("Equals:" + equals); |
| 98 | + log.info(person1.hashCode() + " and " + person2.hashCode()); |
| 99 | + } |
| 100 | +} |
| 101 | + |
| 102 | +//@Getter |
| 103 | +//@Setter |
| 104 | +//@ToString |
| 105 | +//@EqualsAndHashCode |
| 106 | +@Data |
| 107 | +@NoArgsConstructor |
| 108 | +@AllArgsConstructor |
| 109 | +class Person { |
| 110 | + private String name; |
| 111 | + private Integer age; |
| 112 | + private boolean isTeacher; |
| 113 | +} |
| 114 | +``` |
| 115 | + |
| 116 | +可以看到 Person 类除了几个属性定义之外没有其他任何方法代码,运行 LombokTest 可以在控制台看到输出如下。 |
| 117 | + |
| 118 | +```log |
| 119 | +12:12:57.687 [main] INFO Lombok - Person(name=Darcy, age=22, isTeacher=true) |
| 120 | +12:12:57.690 [main] INFO Lombok - Person(name=Darcy, age=22, isTeacher=true) |
| 121 | +12:12:57.690 [main] INFO Lombok - Equals:true |
| 122 | +12:12:57.690 [main] INFO Lombok - 1423350487 and 1423350487 |
| 123 | +
|
| 124 | +Process finished with exit code 0 |
| 125 | +``` |
| 126 | + |
0 commit comments