那些年我們爲之瘋狂的註解

1 @RestController

導入:

import org.springframework.web.bind.annotation.RestController;

官方文檔解釋:

@RestController is a stereotype annotation that combines @ResponseBody and @Controller.

可以看出,@RestController = @ResponseBody + @Controller,也就是說如果使用了@RestController來註解Controller,那麼表示這個Controller中的方法只能返回你封裝好的result vo類,一般前端拿到的是一個json字符串,而不能返回jsp頁面,在配置文件中配置的視圖解析器在這個Controller裡將失效。

2 @Slf4j

在類上使用這個註解可以直接實現日誌輸出,可以替代我們在需要打日誌的每個類中的代碼:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger LOGGER = LoggerFactory.getLogger(FeatureConfigController.class);

使用方法:

在pom.xml引入相應jar包:



org.projectlombok
lombok

在類上加上@Slf4j註解,然後在方法中可以直接使用log變量來打日誌。如果註解@Slf4j注入後找不到變量log,需要IDEA安裝lombok插件:File → settings → Plugins ,搜索lombok。

3 @SneakyThrows

導入:

import lombok.SneakyThrows;

@SneakyThrows註解使用在方法上時,當該方法內有異常時不必try catch,也不必throws,@SneakyThrows註解會自動幫你向上拋出。

使用方法:

import lombok.SneakyThrows;
public class SneakyThrowsExample implements Runnable {
@SneakyThrows(UnsupportedEncodingException.class)
public String utf8ToString(byte[] bytes) {
return new String(bytes, "UTF-8");
}

@SneakyThrows
public void run() {
throw new Throwable();
}
}

@SneakyThrows要慎用,相關官方文檔。

4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

Spring4.3中引進了{@GetMapping、@PostMapping、@PutMapping、@DeleteMapping},來幫助簡化常用的HTTP方法的映射,並更好地表達被註解方法的語義。

@{Get/Post/Put/Delete}Mapping是一個組合註解,是@RequestMapping(method = RequestMethod.{Get/Post/Put/Delete})的縮寫。該註解將HTTP {Get/Post/Put/Delete} 映射到 特定的處理方法上。

使用方法:

@PostMapping("requestpath")
public ResultVo function(){}

5 @PreAuthorize、@PostAuthorize

Spring的 @PreAuthorize/@PostAuthorize 註解更適合方法級的安全,也支持Spring 表達式語言,提供了基於表達式的訪問控制。

@PreAuthorize 註解適合進入方法前的權限驗證,@PreAuthorize可以將登錄用戶的roles/permissions參數傳到方法中。

@PostAuthorize 註解使用並不多,在方法執行後再進行權限驗證。

所以它適合驗證帶有返回值的權限。Spring EL 提供 返回對象能夠在表達式語言中獲取返回的對象returnObject。

還有@EnableWebSecurity和@EnableGlobalMethodSecurity,下面給了一個Spring Security With Annotation demo,可以看看具體的使用方法。

一個Spring Security With Annotation demo

6 @ControllerAdvice @ExceptionHandler

異常的統一處理。

@ControllerAdvice,是spring3.2提供的新註解,從名字上可以看出大體意思是控制器增強。使用@ControllerAdvice註解某個類的時候,該類會被spring當做一個組件,可以在context:component-scan被掃描到。

@ExceptionHandler,異常處理器,應用到所有@RequestMapping註解的方法上,在其拋出指定異常時執行統一異常處理方法。

@ControllerAdvice 
@Slf4j
public class ControllerAdviceTest {

@ExceptionHandler(Exception.class)
@ResponseBody
public ResultVo handleException(Exception e) {
log.warn("拋出{}異常", e);
//返回一個結果類vo
ResultVo result = new ResultVo();
result.setStatus(Constants.Fail);
result.setMsg(e.getMessage());
return result;
}
}

7 其它常用的 lombok 註解

@Data :註解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法

@EqualsAndHashCode:實現equals()方法和hashCode()方法

@ToString:實現toString()方法

@Setter:註解在屬性上;為屬性提供 setting 方法

@Getter:註解在屬性上;為屬性提供 getting 方法

@NoArgsConstructor:註解在類上;為類提供一個無參的構造方法

@AllArgsConstructor:註解在類上;為類提供一個全參的構造方法

@Builder:使用構建模式(Builder pattern)構建一個類實例

不使用 lombok 的方案

public class Example {
private T foo;
private final String bar;
private Example(T foo, String bar) {
this.foo = foo;
this.bar = bar;
}
public static ExampleBuilder builder() {
return new ExampleBuilder();
}
public static class ExampleBuilder {
private T foo;
private String bar;
private ExampleBuilder() {}
public ExampleBuilder foo(T foo) {
this.foo = foo;
return this;
}
public ExampleBuilder bar(String bar) {
this.bar = bar;
return this;
}
@java.lang.Override
public String toString() {
return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
}
public Example build() {
return new Example(foo, bar);
}
}
}

使用 lombok 的方案 guava 16.0.1

 @Builder
public class Example {
private int foo;
private final String bar;
}

構造一個Example實例,屬性不需要單獨set

Example.builder().foo(1).bar(“test”).build()


分享到:


相關文章: