在spring boot中,摒棄了spring以往項目中大量繁瑣的配置,遵循約定大于配置的原則,通過自身預設配置,極大的降低了項目搭建的複雜度。同樣在spring boot中,大量注解的使用,使得代碼看起來更加簡潔,提高開發的效率。這些注解不光包括spring boot自有,也有一些是繼承自spring的。
本文中将spring boot項目中常用的一些核心注解歸類總結,并結合實際使用的角度來解釋其作用。
一、項目配置注解
1、@SpringBootApplication 注解
檢視源碼可發現,@SpringBootApplication是一個複合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個注解。
這三個注解的作用分别為:
- @SpringBootConfiguration:标注目前類是配置類,這個注解繼承自@Configuration。并會将目前類内聲明的一個或多個以@Bean注解标記的方法的執行個體納入到srping容器中,并且執行個體名就是方法名。
- @EnableAutoConfiguration:是自動配置的注解,這個注解會根據我們添加的元件jar來完成一些預設配置,我們做微服時會添加spring-boot-starter-web這個元件jar的pom依賴,這樣配置會預設配置springmvc 和tomcat。
- @ComponentScan:掃描目前包及其子包下被@Component,@Controller,@Service,@Repository注解标記的類并納入到spring容器中進行管理。等價于
大多數情況下,這3個注解會被同時使用,基于最佳實踐,這三個注解就被做了包裝,成為了@SpringBootApplication注解。
2、@ServletComponentScan:Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 注解自動注冊,這樣通過注解servlet ,攔截器,監聽器的功能而無需其他配置,是以這次相中使用到了filter的實作,用到了這個注解。
3、@MapperScan:spring-boot支援mybatis元件的一個注解,通過此注解指定mybatis接口類的路徑,即可完成對mybatis接口的掃描。
它和@mapper注解是一樣的作用,不同的地方是掃描入口不一樣。@mapper需要加在每一個mapper接口類上面。是以大多數情況下,都是在規劃好工程目錄之後,通過@MapperScan注解配置路徑完成mapper接口的注入。
添加mybatis相應組建依賴之後。就可以使用該注解。
進一步檢視mybatis-spring-boot-starter包,可以找到這裡已經将mybatis做了包裝。
這也是spring的一個理念,不重複造輪子,整合優秀的資源進入spring的體系中。
4、資源導入注解:@ImportResource @Import @PropertySource 這三個注解都是用來導入自定義的一些配置檔案。
@ImportResource(locations={}) 導入其他xml配置檔案,需要标準在主配置類上。
導入property的配置檔案 @PropertySource指定檔案路徑,這個相當于使用spring的
@import注解是一個可以将普通類導入到spring容器中做管理
二、controller 層
1、@Controller 表明這個類是一個控制器類,和@RequestMapping來配合使用攔截請求,如果不在method中注明請求的方式,預設是攔截get和post請求。這樣請求會完成後轉向一個視圖解析器。但是在大多微服務搭建的時候,前後端會做分離。是以請求後端隻關注資料處理,後端傳回json資料的話,需要配合@ResponseBody注解來完成。
這樣一個隻需要傳回資料的接口就需要3個注解來完成,大多情況我們都是需要傳回資料。也是基于最佳實踐,是以将這三個注解進一步整合。
@RestController 是@Controller 和@ResponseBody的結合,一個類被加上@RestController 注解,資料接口中就不再需要添加@ResponseBody。更加簡潔。
同樣的情況,@RequestMapping(value="",method= RequestMethod.GET ),我們都需要明确請求方式。這樣的寫法又會顯得比較繁瑣,于是乎就有了如下的幾個注解。
普通風格 | Rest風格 |
---|---|
@RequestMapping(value=“”,method = RequestMethod.GET) | @GetMapping(value =“”) |
@RequestMapping(value=“”,method = RequestMethod.POST) | @PostMapping(value =“”) |
@RequestMapping(value=“”,method = RequestMethod.PUT) | @PutMapping(value =“”) |
@RequestMapping(value=“”,method = RequestMethod.DELETE) | @DeleteMapping(value =“”) |
這幾個注解是 @RequestMapping(value="",method= RequestMethod.xxx )的最佳實踐。為了代碼的更加簡潔。
2、@CrossOrigin:@CrossOrigin(origins = "", maxAge = 1000) 這個注解主要是為了解決跨域通路的問題。這個注解可以為整個controller配置啟用跨域,也可以在方法級别啟用。
我們在項目中使用這個注解是為了解決微服在做定時任務排程編排的時候,會通路不同的spider節點而出現跨域問題。
3、@Autowired:這是個最熟悉的注解,是spring的自動裝配,這個個注解可以用到構造器,變量域,方法,注解類型上。當我們需要從bean 工廠中擷取一個bean時,Spring會自動為我們裝配該bean中标記為@Autowired的元素。
4、@EnablCaching@EnableCaching: 這個注解是spring framework中的注解驅動的緩存管理功能。自spring版本3.1起加入了該注解。其作用相當于spring配置檔案中的cache manager标簽。
5、@PathVariable:路徑變量注解,@RequestMapping中用{}來定義url部分的變量名,如:
同樣可以支援變量名加正規表達式的方式,變量名:[正規表達式]。
三、servcie層注解
1、@Service:這個注解用來标記業務層的元件,我們會将業務邏輯處理的類都會加上這個注解交給spring容器。事務的切面也會配置在這一層。當讓 這個注解不是一定要用。有個泛指元件的注解,當我們不能确定具體作用的時候 可以用泛指元件的注解托付給spring容器。
2、@Resource:@Resource和@Autowired一樣都可以用來裝配bean,都可以标注字段上,或者方法上。 @resource注解不是spring提供的,是屬于J2EE規範的注解。
兩個之前的差別就是比對方式上有點不同,@Resource預設按照名稱方式進行bean比對,@Autowired預設按照類型方式進行bean比對。
四、持久層注解
1、@Repository:@Repository注解類作為DAO對象,管理操作資料庫的對象。
總得來看,@Component, @Service, @Controller, @Repository是spring注解,注解後可以被spring架構所掃描并注入到spring容器來進行管理
@Component是通用注解,其他三個注解是這個注解的拓展,并且具有了特定的功能。
通過這些注解的分層管理,就能将請求處理,義務邏輯處理,資料庫操作處理分離出來,為代碼解耦,也友善了以後項目的維護和開發。
是以我們在正常開發中,如果能用@Service, @Controller, @Repository其中一個标注這個類的定位的時候,就不要用@Component來标注。
2、@Transactional: 通過這個注解可以聲明事務,可以添加在類上或者方法上。
在spring boot中 不用再單獨配置事務管理,一般情況是我們會在servcie層添加了事務注解,即可開啟事務。要注意的是,事務的開啟隻能在public 方法上。并且主要事務切面的復原條件。正常我們配置rollbackfor exception時 ,如果在方法裡捕獲了異常就會導緻事務切面配置的失效。
五、其他相關注解
@ControllerAdvice 和 @RestControllerAdvice:通常和@ExceptionHandler、@InitBinder、@ModelAttribute一起配合使用。
@ControllerAdvice 和 @ExceptionHandler 配合完成統一異常攔截處理。
@RestControllerAdvice 是 @ControllerAdvice 和 @ResponseBody的合集,可以将異常以json的格式傳回資料。
如下面對資料異常傳回的統一處理。
這裡是對平時用到的一些注解做了歸納,及應用說明。還有其他更深的知識還需要在後續的用中繼續學習。
參考文檔
- https://docs.spring.io/spring-boot/docs/2.1.x/reference/html/
- https://spring.io/projects/spring-boot/
作者:缑應奎
來源:宜信技術學院