背景
在項目開發中,記錄日志是必做的一件事情。日志的實現有很多種:Logback,Log4j2,log4j,JAVA Util Logging等等。
而slf4j是一個適配層,由適配層決定使用哪一種日志系統,而調用端只需要做的事情就是打印日志而不需要關心如何打印日志
slf4j是一個日志標準,并不是日志系統的具體實現。理解這句話非常重要,slf4j只做兩件事情:
- 提供日志接口
- 提供獲取具體日志對象的方法
使用slf4j的姿勢是不是這樣的?
public class LogExample {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}
每個類都要使用LoggerFactory生成一個Logger實例,復制代碼時容易把**.class忘記修改,使我們對這樣用法感到很無奈。幸好,lombok提供了一個注解幫我們減少了錯誤和減少代碼量,提升了工作效率。
Slf4j注解使用示例
添加依賴

使用注解

驗證
Slf4j定義

可以看到slf4j注解主要是產生一個log實例,可以作用于類和枚舉。
使用反編譯工具打開FreeMarkerController編譯后的class文件:

可以發現,slf4j注解注解在編譯時主動將注解轉換成
private static final Logger log = LoggerFactory.getLogger(FreeMarkerController.class);
總結及拓展
Lombok不是通過字節碼改寫來實現的。它主要是用編譯器內支持的annotation processing,直接操縱抽象語法樹(AST),根據需要添加新節點。
lombok提供了很多好用的注解,大家可以試用一下:
- @Data 注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
- @Setter :注解在屬性上;為屬性提供 setting 方法
- @Setter :注解在屬性上;為屬性提供 getting 方法
- @Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
- @NoArgsConstructor :注解在類上;為類提供一個無參的構造方法
- @AllArgsConstructor :注解在類上;為類提供一個全參的構造方法
- @Cleanup : 可以關閉流
- @Builder : 被注解的類加個構造者模式
- @Synchronized : 加個同步鎖
- @SneakyThrows : 等同于try/catch 捕獲異常
- @NonNull : 如果給參數加個這個注解 參數為null會拋出空指針異常
- @Value : 注解和@Data類似,區別在于它會把所有成員變量默認定義為private final修飾,并且不會生成set方法。