天天看點

帶你快速了解:40個常用的springBoot注解

作者:東哥聊程式設計

作者:xiexie0812

來源:https://www.cnblogs.com/mask-xiexie/p/16017230.html

一、Spring Web MVC注解

@RequestMapping

@RequestMapping注解的主要用途是将Web請求與請求處理類中的方法進行映射。

Spring MVC和Spring WebFlux都通過RquestMappingHandlerMapping和RequestMappingHndlerAdapter兩個類來提供對@RequestMapping注解的支援。

@RequestMapping注解對請求處理類中的請求處理方法進行标注;

@RequestMapping注解擁有以下的六個配置屬性:

  • value: 映射的請求URL或者其别名
  • 指定請求的實際位址,指定的位址可以是URI Template 模式;
  • method: 相容HTTP的方法名
  • 指定請求的method類型, GET、POST、PUT、DELETE等;
  • params: 根據HTTP參數的存在、預設或值對請求進行過濾
  • ​ 指定request中必須包含某些參數值時,才讓該方法處理。
  • header: 根據HTTP Header的存在、預設或值對請求進行過濾
  • ​ 指定request中必須包含某些指定的header值,才能讓該方法處理請求。
  • consume: 設定在HTTP請求正文中允許使用的媒體類型
  • ​ 指定處理請求的送出内容類型(Content-Type),例如application/json, text/html;
  • product: 在HTTP響應體中允許使用的媒體類型
  • ​ 指定傳回的内容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才傳回;

提示:在使用@RequestMapping之前,請求處理類還需要使用@Controller或@RestController進行标記

示例

@RestController
public class ControllerTest {

    @RequestMapping(value = "/demo/home", method = RequestMethod.GET)
    public String home() {
        return "home";
    }
    
    // controller–限制接收post 請求以及consumes="application/json"。
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST,consumes="application/json")
    public String testMethod() {
        System.out.println("testMethod");
        return "SUCCESS";
    }
    
    // 傳回值類型是json格式
    // text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    // 其中最後一項 : */*;q=0.8。
    // 該項表明可以接收任何類型的,權重系數0.8表明如果前面幾種類型不能正常接收。則使用該項進行自動分析。
    // application/json 幾種主流浏覽器都可以自動解析。
    @RequestMapping(value = "/testMethod", method = RequestMethod.POST,produces="application/json")
    @ResponseBody
    public RestMessage testMethod2(Model model) throws IOException {

        return new RestMessage("SUCCESS");
    }


    // 設定必須包含username 和age兩個參數,且age參數不為10 (可以有多個參數)。
    @RequestMapping(value = "testParams", params = { "username","age!=10" })
    public String testParams() {
        System.out.println("testParamsAndHeaders");
        return "SUCCESS";
    }

    // 設定請求頭中第一語言必須為US。
    // 必須包含username 和age兩個參數,且age參數不為10 (可以有多個參數)。
    @RequestMapping(value = "testParamsAndHeaders", params = { "username","age!=10" }, headers = { "Accept-Language=US,zh;q=0.8" })
    public String testParamsAndHeaders() {
        System.out.println("testParamsAndHeaders");
        return "SUCCESS";
    }
}
           

@RequestBody

@RequestBody在處理請求方法的參數清單中使用,它可以将請求主體中的參數綁定到一個對象中,請求主體參數是通過HttpMessageConverter傳遞的,

根據請求主體中的參數名與對象的屬性名進行比對并綁定值。

此外,還可以通過@Valid注解對請求主體中的參數進行校驗。

示例

@PostMapping("/user")
public User createUser(@Valid @RequestBody User user) {
    return sava(user);
}
           

@GetMapping

@GetMapping注解用于處理HTTP GET請求,并将請求映射到具體的處理方法中。

具體來說,@GetMapping是一個組合注解,它相當于是@RequestMapping(method=RequestMethod.GET)的快捷方式。

@PostMapping

@PostMapping注解用于處理HTTP POST請求,并将請求映射到具體的處理方法中。@PostMapping與@GetMapping一樣,也是一個組合注解,它相當于是@RequestMapping(method=HttpMethod.POST)的快捷方式。

@PutMapping

@PutMapping注解用于處理HTTP PUT請求,并将請求映射到具體的處理方法中,@PutMapping是一個組合注解,相當于是@RequestMapping(method=HttpMethod.PUT)的快捷方式。

@DeleteMapping

@DeleteMapping注解用于處理HTTP DELETE請求,并将請求映射到删除方法中。@DeleteMapping是一個組合注解,它相當于是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。

@PatchMapping

@PatchMapping注解用于處理HTTP PATCH請求,并将請求映射到對應的處理方法中。@PatchMapping相當于是@RequestMapping(method=HttpMethod.PATCH)的快捷方式。

@ControllerAdvice

@ControllerAdvice是@Component注解的一個延伸注解,Spring會自動掃描并檢測被@ControllerAdvice所标注的類。

@ControllerAdvice需要和@ExceptionHandler、@InitBinder以及@ModelAttribute注解搭配使用,主要是用來處理控制器所抛出的異常資訊。

首先,我們需要定義一個被@ControllerAdvice所标注的類,在該類中,定義一個用于處理具體異常的方法,并使用@ExceptionHandler注解進行标記。

此外,在有必要的時候,可以使用@InitBinder在類中進行全局的配置,還可以使用@ModelAttribute配置與視圖相關的參數。

使用@ControllerAdvice注解,就可以快速的建立統一的,自定義的異常處理類。

示例

@ControllerAdvice(basePackages = {"com.xie.controller"})
public class UserControllerAdvice {

    @InitBinder
    public void binder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

        // String dob= "1/55/1999";
        // SimpleDateFormat的setLenient(true)
        // 這種情況下java會把你輸入的日期進行計算,比如55個月那麼就是4年以後,這時候年份就會變成03年了
        // SimpleDateFormat的setLenient(false)
        // 這種情況下java不會把你輸入的日期進行計算,比如55個月那麼就是不合法的日期了,直接異常
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, "user", new CustomDateEditor(dateFormat, true));
    }

    @ModelAttribute
    public void modelAttribute(Model model) {
        model.addAttribute("messgae", "User not found exception.");
    }

    @ExceptionHandler(UserNotFoundException.class)
    public ModelAndView userNotFoundExceptionHandler(UserNotFoundException exception) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("exception", exception);
        modelAndView.setViewName("erro");
        return modelAndView;
    }
}
           

@ResponseBody

@ResponseBody會自動将控制器中方法的傳回值寫入到HTTP響應中。

特别的,@ResponseBody注解隻能用在被@Controller注解标記的類中。

如果在被@RestController标記的類中,則方法不需要使用@ResponseBody注解進行标注。

@RestController相當于是@Controller和@ResponseBody的組合注解。

@RequestMapping(value = "/testMethod")
@ResponseBody
public RestMessage testMethod2(Model model) throws IOException {

    return new RestMessage("SUCCESS");
}
           

@ExceptionHandler

@ExceptionHander注解用于标注處理特定類型異常類所抛出異常的方法。

當控制器中的方法抛出異常時,Spring會自動捕獲異常,并将捕獲的異常資訊傳遞給被@ExceptionHandler标注的方法。

@ExceptionHandler(UserNotFoundException.class)
public ModelAndView userNotFoundExceptionHandler(UserNotFoundException exception) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("exception", exception);
    modelAndView.setViewName("erro");
    return modelAndView;
}
           

@ResponseStatus

@ResponseStatus注解可以标注請求處理方法。使用此注解,可以指定響應所需要的HTTP STATUS。

特别地,我們可以使用HttpStauts類對該注解的value屬性進行指派。

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(UserNotFoundException.class)
public ModelAndView userNotFoundExceptionHandler(UserNotFoundException exception) {
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.addObject("exception", exception);
    modelAndView.setViewName("erro");
    return modelAndView;
}
           

@PathVariable

@PathVariable注解是将方法中的參數綁定到請求URI中的模闆變量上。

可以通過@RequestMapping注解來指定URI的模闆變量,然後使用@PathVariable注解将方法中的參數綁定到模闆變量上。

特别地,@PathVariable注解允許我們使用value或name屬性來給參數取一個别名

@GetMapping("users/{id}/roles/{roleId}")
    public Role getUserRole(@PathVariable(name = "id") long id, @PathVariable(name = "roleId") long roleId) {

    return new Role();
}
           

@RequestParam

@RequestParam注解用于将方法的參數與Web請求的傳遞的參數進行綁定。

使用@RequestParam可以輕松的通路HTTP請求參數的值。

@GetMapping("/role")
    public Role getUserRole(@RequestParam(name = "id") long id, @RequestParam(name = "roleId") long roleId) {

    return new Role();
}
// 特别的,如果傳遞的參數為空,還可以通過defaultValue設定一個預設值。示例代碼如下:
           

@Controller

@Controller是@Component注解的一個延伸,Spring會自動掃描并配置被該注解标注的類。

此注解用于标注Spring MVC的控制器。

@RestController

@RestController是在Spring 4.0開始引入的,這是一個特定的控制器注解。

此注解相當于@Controller和@ResponseBody的快捷方式。

當使用此注解時,不需要再在方法上使用@ResponseBody注解。

@ModelAttribute

通過此注解,可以通過模型索引名稱來通路已經存在于控制器中的model。

需要在研究下

@CrossOrigin

@CrossOrigin注解将為請求處理類或請求處理方法提供跨域調用支援。

如果我們将此注解标注類,那麼類中的所有方法都将獲得支援跨域的能力。

使用此注解的好處是可以微調跨域行為。

@CrossOrigin
@GetMapping("/role")
public Role getUserRole(@RequestParam(name = "id") long id, @RequestParam(name = "roleId") long roleId) {

    return new Role();
}
           

@InitBinder

@InitBinder注解用于标注初始化WebDataBinider的方法,

該方法用于對Http請求傳遞的表單資料進行處理,如時間格式化、字元串處理等。

@InitBinder
public void binder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());

    // String dob= "1/55/1999";
    // SimpleDateFormat的setLenient(true)
    // 這種情況下java會把你輸入的日期進行計算,比如55個月那麼就是4年以後,這時候年份就會變成03年了
    // SimpleDateFormat的setLenient(false)
    // 這種情況下java不會把你輸入的日期進行計算,比如55個月那麼就是不合法的日期了,直接異常
    dateFormat.setLenient(false);
    binder.registerCustomEditor(Date.class, "user", new CustomDateEditor(dateFormat, true));
}
           

二、Spring Bean 注解

@ComponentScan

@ComponentScan注解用于配置Spring需要掃描的被元件注解注釋的類所在的包。

可以通過配置其basePackages屬性或者value屬性來配置需要掃描的包路徑。value屬性是basePackages的别名。

@Component

@Component注解用于标注一個普通的元件類,它沒有明确的業務範圍,隻是通知Spring被此注解的類需要被納入到Spring Bean容器中并進行管理。

@Service

@Service注解是@Component的一個延伸(特例),它用于标注業務邏輯類。

與@Component注解一樣,被此注解标注的類,會自動被Spring所管理。

@Repository

@Repository注解也是@Component注解的延伸,與@Component注解一樣,被此注解标注的類會被Spring自動管理起來,

@Repository注解用于标注DAO層的資料持久化類。

三、Spring Dependency Inject

@DependsOn

@DependsOn注解可以配置Spring IoC容器在初始化一個Bean之前,先初始化其他的Bean對象。

@Bean("firstBean")
@DependsOn(value = {"secondBean", "thirdBean"})
public firstBean firstBean() {
    return new FirstBean();
}
           

@Bean

@Bean注解主要的作用是告知Spring,被此注解所标注的類将需要納入到Bean管理工廠中。

@Bean注解的用法很簡單,在這裡,着重介紹@Bean注解中initMethod和destroyMethod的用法。

@Component
public class DataBaseInitializer {

    public void init() {
        System.out.println("This is init method");
    }

    public void destroy() {
        System.out.println("This is destroy method");
    }
}

// 引入bean
@Bean(initMethod = "init", destroyMethod = "destroy")
public DataBaseInitializer dataBaseInitializer() {
    return new DataBaseInitializer();
}
           

@Scope

@Scope注解可以用來定義@Component标注的類的作用範圍以及@Bean所标記的類的作用範圍。

@Scope所限定的作用範圍有:singleton、prototype、request、session、globalSession或者其他的自定義範圍。

這裡以prototype為例子進行講解。

當一個Spring Bean被聲明為prototype(原型模式)時,在每次需要使用到該類的時候,Spring IoC容器都會初始化一個新的改類的執行個體。

在定義一個Bean時,可以設定Bean的scope屬性為prototype:scope=“prototype”,也可以使用@Scope注解設定,如下:

@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE)  
           

兩種配置方式:

// 第一種
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public DataBaseInitializer dataBaseInitializer() {
    return new DataBaseInitializer();
}

// ----------------------------------------

// 第二種
@Component
@Scope(value= ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class DataBaseInitializer {

    public void init() {
        System.out.println("This is init method");
    }

    public void destroy() {
        System.out.println("This is destroy method");
    }
}
           

@Scope 單例模式

當@Scope的作用範圍設定成Singleton時,被此注解所标注的類隻會被Spring IoC容器初始化一次。

在預設情況下,Spring IoC容器所初始化的類執行個體都為singleton。

同樣的原理,此情形也有兩種配置方式,示例代碼如@Scope上述

@Autowired

@Autowired注解用于标記Spring将要解析和注入的依賴項。

此注解可以作用在構造函數、字段和setter方法上。

@Primary

當系統中需要配置多個具有相同類型的bean時,@Primary可以定義這些Bean的優先級。

比如多個實作類serviceImpl,有一個實作類注解加@Primary則優先實作該類。

@PostConstruct與@PreDestroy

值得注意的是,這兩個注解不屬于Spring,它們是源于JSR-250中的兩個注解,位于common-annotations.jar中。

@PostConstruct注解用于标注在Bean被Spring初始化之前需要執行的方法。

@PreDestroy注解用于标注Bean被銷毀前需要執行的方法。下面是具體的示例代碼:

@Component
public class DemoComponet {

    private List<String> list = new ArrayList<>();

    @PostConstruct
    public void init() {
        list.add("q");
        list.add("w");
    }

    @PreDestroy
    public void destroy() {
        list.clear();
    }
}
           

@Qualifier

當系統中存在同一類型的多個Bean時,@Autowired在進行依賴注入的時候就不知道該選擇哪一個實作類進行注入。

此時,我們可以使用@Qualifier注解來微調,幫助@Autowired選擇正确的依賴項。

@Qualifier("要使用的實作類")
// 個人了解 java多态特征
           

@SpringBootApplication

@SpringBootApplication注解是一個快捷的配置注解(啟動類注解),

在被它标注的類中,可以定義一個或多個Bean,并自動觸發自動配置Bean和自動掃描元件。

此注解相當于@Configuration、@EnableAutoConfiguration和@ComponentScan的組合。

在Spring Boot應用程式的主類中,就使用了此注解。示例代碼如下:

@SpringBootApplication  
public class Application{  
 public static void main(String \[\] args){  
   SpringApplication.run(Application.class,args);  
 }  
}
           

@EnableAutoConfiguration

@EnableAutoConfiguration注解用于通知Spring,

根據目前類路徑下引入的依賴包,自動配置與這些依賴包相關的配置項。

@ConditionalOnClass與@ConditionalOnMissingClass

這兩個注解屬于類條件注解,它們根據是否存在某個類作為判斷依據來決定是否要執行某些配置。

下面是一個簡單的示例代碼:

@Configuration  
@ConditionalOnClass(DataSource.class)  
class MySQLAutoConfiguration {  
 //...  
}
           

@ConditionalOnBean與@ConditionalOnMissingBean

這兩個注解屬于對象條件注解,根據是否存在某個對象作為依據來決定是否要執行某些配置方法。

@Bean  
@ConditionalOnBean(name="dataSource")  
LocalContainerEntityManagerFactoryBean entityManagerFactory(){  
 //...  
}  
@Bean  
@ConditionalOnMissingBean  
public MyBean myBean(){  
 //...  
}
           

@ConditionalOnProperty

@ConditionalOnProperty注解會根據Spring配置檔案中的配置項是否滿足配置要求,進而決定是否要執行被其标注的方法。示例代碼如下:

@Bean  
@ConditionalOnProperty(name="alipay",havingValue="on")  
Alipay alipay(){  
 return new Alipay();  
}
           

@ConditionalOnResource

此注解用于檢測當某個配置檔案存在使,則觸發被其标注的方法,下面是使用此注解的代碼示例:

@ConditionalOnResource(resources = "classpath:website.properties")  
Properties addWebsiteProperties(){  
 //...  
}
           

@ConditionalOnWebApplication與@ConditionalOnNotWebApplication

這兩個注解用于判斷目前的應用程式是否是Web應用程式。如果目前應用是Web應用程式,則使用Spring WebApplicationContext,并定義其會話的生命周期。下面是一個簡單的示例:

@ConditionalOnWebApplication  
HealthCheckController healthCheckController(){  
 //...  
}
           

@ConditionalExpression

此注解可以讓我們控制更細粒度的基于表達式的配置條件限制。當表達式滿足某個條件或者表達式為真的時候,将會執行被此注解标注的方法。

@Bean  
@ConditionalException("${localstore} && ${local == 'true'}")  
LocalFileStore store(){  
 //...  
}
           

@Conditional

@Conditional注解可以控制更為複雜的配置條件。在Spring内置的條件控制注解不滿足應用需求的時候,可以使用此注解定義自定義的控制條件,以達到自定義的要求。下面是使用該注解的簡單示例:

@Conditioanl(CustomConditioanl.class)  
CustomProperties addCustomProperties(){  
 //...  
}           

歡迎一起來學習和指導,謝謝關注!