Lombok常用註解總結

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

發佈了62 篇原創文章 · 獲贊 48 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章