如何簡化實體類程式碼
Spring boot使用Lombok編碼
新增依賴
在 pom.xml 檔案中新增相關依賴:
<lombok.version>1.16.20</lombok.version> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency>
安裝外掛
由於 Lombok
採取的註解形式的,在編譯後,自動生成相應的方法,為了不讓 ide 瘋了,需要下載外掛了支援它。
以 idea 為例:查詢外掛 lombok plugin
安裝即可。
用我的 User 實體類為例(set,get,toString 方法),
@Getter @Setter @ToString public class SysUserEntity implements Serializable
在按快捷鍵 Ctrl + F12
,可以查詢到set,get,toString 方法。
註解
寫點常用的,其餘的 api 的開啟 Jar 包一目瞭然
@[email protected]@[email protected]建構函式
@AllArgsConstructor
會生成一個包含所有變數,同時如果變數使用了NotNull annotation , 會進行是否為空的校驗,
全部引數的建構函式的自動生成,該註解的作用域也是隻有在實體類上,引數的順序與屬性定義的順序一致。
@NoArgsConstructor
無參建構函式
@RequiredArgsConstructor
會生成一個包含常量(final),和標識了@NotNull的變數 的構造方法。
怎麼使用
它們都有三個引數可以設定
1. String staticName() default "";
如果設定了它,將原來的構造方法的訪問修飾符將會變成 私有的,而外新增一個靜態構造方法,引數相同,名字是設定的字串的名字,訪問修飾符為公有的。
-
AnyAnnotation[] onConstructor() default {};
在構造方法上新增註解。使用方法@RequiredArgsConstructor([email protected]__({@AnnotationsGoHere}))}
例如我們在 Spring 專案中需要注入多個值,寫很多個
@Autowired
很麻煩,就可以使用這種方式:@Service @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class UserServiceImpl implements IUserService { private final IUserRepository userRepository; private final IOrderRepository orderRepository;
-
AccessLevel access() default lombok.AccessLevel.PUBLIC;
建構函式訪問修飾符; -
@NoArgsConstructor
無參建構函式中還有個註解boolean force() default false;
作者的註釋是 If {@code true}, initializes all final fields to 0 / null / false. Otherwise, a compile time error occurs.設定為
true
的時候,初始化所有的引數為預設值,否則編譯錯誤。
@Data
我自己嘗試了下,我們使用 @Data
註解就可以有下面幾個註解的功能: @ToString
、@Getter
、@Setter
、@EqualsAndHashCode
、@NoArgsConstructor
。
注意的是,同時使用
@Data
和@AllArgsConstructor
後 ,預設的無參建構函式失效,如果需要它,要重新設定@NoArgsConstructor
@Slf4j
//類上面註解了,直接呼叫 log 即可:log.info(xxxx);
@Log
使用的是 java.util.logging.Logger
,直接使用 變數 log
。
@Builder
bulder 模式構建物件。
@Cleanup
<wiz_code_mirror>
InputStream in = new FileInputStream(args[0]);
OutputStream out = new FileOutputStream(args[1]);
自動化關閉流,相當於 jdk1.7 種的 try with resource
val
型別推導。
<wiz_code_mirror> val example = new ArrayList<String>();
example.add("Hello, World!");
對應的轉換後代碼就是:
<wiz_code_mirror> val example = new ArrayList<String>();
example.add("Hello, World!");
@NonNull
<wiz_code_mirror>public NonNullExample(
this.name = person.getName();
}
轉換後就是:
<wiz_code_mirror>public NonNullExample(
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
}
@SneakyThrows
翻譯就是暗中丟擲異常
當我們需要丟擲異常,在當前方法上呼叫,不用顯示的在方法名後面寫 throw
<wiz_code_mirror>
@Synchronized
方法中所有的程式碼都加入到一個程式碼塊中,預設靜態方法使用的是全域性鎖,普通方法使用的是物件鎖,當然也可以指定鎖的物件。
<wiz_code_mirror>private final Object lock = new Object();
public void foo() {
// Do something
}
實際開發中往往將 synchronized
顆粒化到程式碼塊中。