Lombok常用註解總結
什麼是Lombok
Lombok是一個通過使用註解修飾,來簡化Java代碼的一個工具庫。
下面爲大家介紹一些常用的Lombok工具註解:
基本註解:
註解 | 功能 |
---|---|
@ToString | 修飾JavaBean,可以動態生成相應的ToString方法, 格式爲:User(username=admin, password=123)<br / |
@EqualsAndHashCode | 修飾JavaBean,默認情況下,會使用所有非靜態(non-static)和非瞬態(non-transient)屬性來生成equals和hasCode |
@Getter | 可以修飾JavaBean,也可以修飾屬性,生成相應屬性的get()方法 |
@Setter | 可以修飾JavaBean,也可以修飾屬性,生成相應屬性的set()方法 |
@NonNull | 修飾方法參數,自動判斷參數是否爲null,爲nulll則拋出NullPointerException |
@NoArgsConstructor | 修飾JavaBean,可以動態生成無參構造器方法 |
@RequiredArgsConstructor | 修飾JavaBean,生成private構造方法,使用staticName選項生成指定名稱的static方法,與@NonNull聯用,指定那些屬性是本方法參數 |
@AllArgsConstructor | 修飾JavaBean,可以動態生成全參構造器方法 |
@Data | 修飾JavaBean,集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性。 |
@Value | 修飾JavaBean,和@Data類似,區別在於它會把所有成員變量默認定義爲private final修飾,並且不會生成set方法 |
@Slf4j | 修飾JavaBean,當項目中使用Slf4j日誌架構的時候自動創建log日誌實例 |
@Log4j | 修飾JavaBean,當項目中使用Log4j日誌架構的時候自動創建log日誌實例,需要創建log4j.properties配置文件,推薦使用@Log4j2 |
@Log4j2 | 修飾JavaBean,當項目中使用Log4j日誌架構的時候自動創建日誌實例,不需要配置文件 |
@Synchronized | 修飾方法,自動生成同步代碼塊鎖 |
@Cleanup | 修飾流變量,自動調用close()方法 |
高級註解:
註解 | 功能 |
---|---|
@Accessors(chain=true) | 修飾JavaBean,鏈式風格,在調用set方時,返回當前實例 |
@Builder | 修飾JavaBean,構建者模式,不可與@NoArgsConstructor同時使用 |
@Delegate | 修飾JavaBean,代理模式 |
IDEA Lombok 插件安裝
打開IDEA
Ctrl + Alt + S 打開 設置面板
在Plugins的Marketplace中搜索Lombok
Lombok Maven座標
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
Lombok 公共屬性
屬性 | 作用 |
---|---|
exclude | 不包含哪些屬性 示例:@ToString(exclude = {“username”}) |
of | 包含哪些屬性 示例:@ToString(of = {“username”}) |
callSuper | 是否包含超類 示例:@ToString(callSuper=true) |
示例參考@ToString
Lombok 基礎註解 詳解
@ToString
修飾JavaBean,可以動態生成相應的ToString方法,格式爲:User(username=admin, password=123)
@ToString(exclude={“column1”,“column2”}):排除多個column列所對應的元素
@ToString(of={“column1”,“column2”}):只生成包含多個column列所對應的元素
代碼實現
public class Test {
public static void main(String[] args) {
User1 user1 = new User1().setUsername("admin").setPassword("123");
System.out.println(user1);
User2 user2 = new User2().setUsername("admin").setPassword("123");
System.out.println(user2);
User3 user3 = new User3().setUsername("admin").setPassword("123");
System.out.println(user3);
User4 user4 = new User4().setUsername("admin").setPassword("123");
System.out.println(user4);
}
}
@ToString
class User1{
private String username;
private String password;
public User1 setUsername(String username) {
this.username = username;
return this;
}
public User1 setPassword(String password) {
this.password = password;
return this;
}
}
@ToString(exclude = {"username"})
class User2{
private String username;
private String password;
public User2 setUsername(String username) {
this.username = username;
return this;
}
public User2 setPassword(String password) {
this.password = password;
return this;
}
}
@ToString(of = {"username"})
class User3{
private String username;
private String password;
public User3 setUsername(String username) {
this.username = username;
return this;
}
public User3 setPassword(String password) {
this.password = password;
return this;
}
}
@ToString(callSuper=true, includeFieldNames=false)
class User4{
private String username;
private String password;
public User4 setUsername(String username) {
this.username = username;
return this;
}
public User4 setPassword(String password) {
this.password = password;
return this;
}
}
輸出結果
User1(username=admin, password=123)
User2(password=123)
User3(username=admin)
User4(super=com.test.User4@6536e911, admin, 123)
@EqualsAndHashCode
修飾JavaBean,默認情況下,會使用所有非靜態(non-static)和非瞬態(non-transient)屬性來生成equals和hasCode
代碼實現
public class Test {
public static void main(String[] args) {
User1 user11 = new User1().setUsername("admin").setPassword("123");
User1 user12 = new User1().setUsername("admin1").setPassword("123");
System.out.println(user11.equals(user12));
User2 user21 = new User2().setUsername("admin").setPassword("123");
User2 user22 = new User2().setUsername("admin1").setPassword("123");
System.out.println(user21.equals(user22));
User3 user31 = new User3().setUsername("admin").setPassword("123");
User3 user32 = new User3().setUsername("admin").setPassword("1234");
System.out.println(user31.equals(user32));
}
}
@EqualsAndHashCode
class User1{
private String username;
private String password;
public User1 setUsername(String username) {
this.username = username;
return this;
}
public User1 setPassword(String password) {
this.password = password;
return this;
}
}
@EqualsAndHashCode(exclude = {"username"})
class User2{
private String username;
private String password;
public User2 setUsername(String username) {
this.username = username;
return this;
}
public User2 setPassword(String password) {
this.password = password;
return this;
}
}
@EqualsAndHashCode(of = {"username"})
class User3{
private String username;
private String password;
public User3 setUsername(String username) {
this.username = username;
return this;
}
public User3 setPassword(String password) {
this.password = password;
return this;
}
}
輸出結果
false
true
true
@Getter
可以修飾JavaBean,也可以修飾屬性,生成相應屬性的get()方法
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User();
System.out.println("username:" + user.getUsername());
System.out.println("password:" + user.getPassword());
}
}
@Getter
class User{
private String username = "admin";
private String password = "123";
}
輸出結果
username:admin
password:123
@Setter
可以修飾JavaBean,也可以修飾屬性,生成相應屬性的set()方法
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User();
user.setUsername("admin");
user.setPassword("123");
System.out.println(user);
}
}
@Setter
@ToString
class User{
private String username;
private String password;
}
輸出結果
User(username=admin, password=123)
@NonNull
修飾方法參數,自動判斷參數是否爲null,爲null則拋出NullPointerException
代碼實現
public class Test {
public static void main(String[] args) {
Test.test("");
Test.test(null);
}
public static void test(@NonNull String str) {
System.out.println("str:" + str);
}
}
輸出結果
str:
Exception in thread "main" java.lang.NullPointerException: str
@NoArgsConstructor
修飾JavaBean,可以動態生成無參構造器方法
最沒用的註解,沒有之一!
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User();
System.out.println(user);
}
}
@NoArgsConstructor
class User{
private String username;
private String password;
}
輸出結果
com.test.User@7bb11784
@RequiredArgsConstructor
修飾JavaBean,生成private構造方法,使用staticName選項生成指定名稱的static方法,與@NonNull聯用,指定那些屬性是本方法參數
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User();
System.out.println("user:" + user);
User2 user2 = User2.of();
System.out.println("user2:" + user2);
}
}
@RequiredArgsConstructor
class User{
private String username;
private String password;
}
@RequiredArgsConstructor(staticName = "of")
class User2{
private String username;
private String password;
}
輸出結果
user:com.test.User@7bb11784
user2:com.test.User2@33a10788
@AllArgsConstructor
修飾JavaBean,可以動態生成全參構造器方法
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User("admin", "123");
System.out.println("user:" + user);
}
}
@AllArgsConstructor()
@ToString
class User{
private String username;
private String password;
}
輸出結果
user:User(username=admin, password=123)
@Data
修飾JavaBean,集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的所有特性,如果屬性中
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User();
User user1 = new User();
System.out.println(user.equals(user1));
user.setUsername("admin");
System.out.println("admin:" + user.getUsername());
System.out.println("user:" + user);
User2 user2 = User2.of("admin2");
System.out.println("user2:" + user2);
}
}
@Data
class User{
private String username;
private String password;
}
@Data(staticConstructor = "of")
class User2{
@NonNull
private String username;
private String password;
}
輸出結果
true
admin:admin
user:User(username=admin, password=null)
user2:User2(username=admin2, password=null)
@Value
修飾JavaBean,和@Data類似,區別在於它會把所有成員變量默認定義爲private final修飾,並且不會生成set方法
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User("admin", "123");
System.out.println(user);
}
}
@Value
class User{
private String username;
private String password;
}
輸出結果
User(username=admin, password=123)
@Slf4j
修飾JavaBean,當項目中使用Slf4j日誌架構的時候自動創建log日誌實例
@Slf4j主要用於替換如下代碼
private static final Logger log = LoggerFactory.getLogger(當前類名.class);
Slf4j Maven 座標
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
代碼實現
@Slf4j
public class Test {
public static void main(String[] args) {
log.info("test");
}
}
輸出結果
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/maven_repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/maven_repository/org/apache/logging/log4j/log4j-slf4j-impl/2.10.0/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
09:59:36.413 [main] INFO com.test.Test - test
@Log4j
修飾JavaBean,當項目中使用Log4j日誌架構的時候自動創建日誌實例
@Log4j主要用於替換如下代碼
private static final Logger log = Logger.getLogger(當前類名.class);
Log4j Maven 座標
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
在項目的resources目錄下,創建log4j.properties文件,內容如下:
# Global logging configuration 開發時候建議使用 debug
#log4j.rootLogger=debug, stdout
log4j.rootLogger=info, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
代碼實現
@Log4j
public class Test {
public static void main(String[] args) {
log.info("test");
}
}
輸出結果
2019-12-23 10:34:46,566 INFO [com.test.Test] - test
@Log4j2
修飾JavaBean,當項目中使用Log4j日誌架構的時候自動創建日誌實例
@Log4j主要用於替換如下代碼
private static final Logger log = Logger.getLogger(當前類名.class);
Log4j Maven 座標
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
代碼實現
@Log4j2
public class Test {
public static void main(String[] args) {
log.info("test");
}
}
輸出結果
10:49:52.742 [main] INFO com.test.Test - test
@Synchronized
修飾方法,自動生成同步代碼塊鎖
@Sychronized 是一個處理線程安全問題的annotation, 類似 synchronized關鍵字,不同點在於關鍵字synchronized是鎖定當前對象(this指針) , 而@Synchronized則會鎖定一個private的常量。如果當前類中沒有這個常量,就會自動生成一個。
代碼實現
public class Test {
@Synchronized
public static void test1() {
System.out.println("test1");
}
@Synchronized
public void test2() {
System.out.println("test2");
}
@Synchronized("readLock")
public void test3() {
System.out.println("test3");
}
}
相當於
public class Test {
private static final Object $LOCK = new Object[0];
private final Object $lock = new Object[0];
private final Object readLock = new Object();
public static void test1() {
synchronized($LOCK) {
System.out.println("test1");
}
}
public void test2() {
synchronized($lock) {
System.out.println("test2");
}
}
public void test3() {
synchronized(readLock) {
System.out.println("test3");
}
}
}
@Cleanup
修飾流變量,自動調用close()方法
代碼實現
public class Test {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
}
}
Lombok 高級註解 詳解
@Accessors(chain=true)
修飾JavaBean,鏈式風格,在調用set方時,返回當前實例
代碼實現
public class Test {
public static void main(String[] args) {
User user = new User().setUsername("admin").setPassword("123");
System.out.println(user);
}
}
@Setter
@ToString
@Accessors(chain = true)
class User{
private String username;
private String password;
}
輸出結果
User(username=admin, password=123)
@Builder
修飾JavaBean,構建者模式,不可與@NoArgsConstructor同時使用
代碼實現
public class Test {
public static void main(String[] args) {
User user = User.builder().username("admin").password("123").build();
System.out.println(user);
}
}
@Builder
@ToString
class User{
private String username;
private String password;
}
輸出結果
User(username=admin, password=123)
@Delegate
修飾JavaBean,代理模式
代碼實現
@AllArgsConstructor
public abstract class FilterRestTemplate implements RestOperations {
@Delegate
protected volatile RestTemplate restTemplate;
}
/*********************************************/
public abstract class FilterRestTemplate implements RestOperations {
protected volatile RestTemplate restTemplate;
protected FilterRestTemplate(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@Override
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.getForObject(url,responseType,uriVariables);
}
@Override
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
return restTemplate.getForObject(url,responseType,uriVariables);
}
@Override
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException {
return restTemplate.getForObject(url,responseType);
}
@Override
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException {
return restTemplate.getForEntity(url,responseType,uriVariables);
}
//其他實現代碼略。。。
}
參考:
https://www.cnblogs.com/heyonggang/p/8638374.html
https://www.cnblogs.com/pascall/p/10281169.html