在spring boot中,摒棄了spring以往項目中大量繁瑣的配置,遵循約定大於配置的原則,經過自身默認配置,極大的下降了項目搭建的複雜度。一樣在spring boot中,大量註解的使用,使得代碼看起來更加簡潔,提升開發的效率。這些註解不光包括spring boot自有,也有一些是繼承自spring的。html
本文中將spring boot項目中經常使用的一些核心註解歸類總結,並結合實際使用的角度來解釋其做用。web
項目配置註解正則表達式
一、@SpringBootApplication 註解spring
查看源碼可發現,@SpringBootApplication是一個複合註解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個註解。數據庫
這三個註解的做用分別爲:json
@SpringBootConfiguration:標註當前類是配置類,這個註解繼承自@Configuration。並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例歸入到srping容器中,而且實例名就是方法名。後端
@EnableAutoConfiguration:是自動配置的註解,這個註解會根據咱們添加的組件jar來完成一些默認配置,咱們作微服時會添加spring-boot-starter-web這個組件jar的pom依賴,這樣配置會默認配置springmvc 和tomcat。跨域
@ComponentScan:掃描當前包及其子包下被@Component,@Controller,@Service,@Repository註解標記的類並歸入到spring容器中進行管理。等價於<context:component-scan>的xml配置文件中的配置項。緩存
大多數狀況下,這3個註解會被同時使用,基於最佳實踐,這三個註解就被作了包裝,成爲了@SpringBootApplication註解。tomcat
二、@ServletComponentScan:Servlet、Filter、Listener 能夠直接經過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,這樣經過註解servlet ,攔截器,監聽器的功能而無需其餘配置,因此此次相中使用到了filter的實現,用到了這個註解。
三、@MapperScan:spring-boot支持mybatis組件的一個註解,經過此註解指定mybatis接口類的路徑,便可完成對mybatis接口的掃描。
它和@mapper註解是同樣的做用,不一樣的地方是掃描入口不同。@mapper須要加在每個mapper接口類上面。因此大多數狀況下,都是在規劃好工程目錄以後,經過@MapperScan註解配置路徑完成mapper接口的注入。
添加mybatis相應組建依賴以後。就可使用該註解。
進一步查看mybatis-spring-boot-starter包,能夠找到這裏已經將mybatis作了包裝。
這也是spring的一個理念,不重複造輪子,整合優秀的資源進入spring的體系中。
四、資源導入註解:@ImportResource @Import @PropertySource 這三個註解都是用來導入自定義的一些配置文件。
@ImportResource(locations={}) 導入其餘xml配置文件,須要標準在主配置類上。
導入property的配置文件 @PropertySource指定文件路徑,這個至關於使用spring的<importresource/>標籤來完成配置項的引入。
@import註解是一個能夠將普通類導入到spring容器中作管理
controller 層
一、@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 )的最佳實踐。爲了代碼的更加簡潔。
二、@CrossOrigin:@CrossOrigin(origins = "", maxAge = 1000) 這個註解主要是爲了解決跨域訪問的問題。這個註解能夠爲整個controller配置啓用跨域,也能夠在方法級別啓用。
咱們在項目中使用這個註解是爲了解決微服在作定時任務調度編排的時候,會訪問不一樣的spider節點而出現跨域問題。
三、@Autowired:這是個最熟悉的註解,是spring的自動裝配,這個個註解能夠用到構造器,變量域,方法,註解類型上。當咱們須要從bean 工廠中獲取一個bean時,Spring會自動爲咱們裝配該bean中標記爲@Autowired的元素。
四、@EnablCaching@EnableCaching: 這個註解是spring framework中的註解驅動的緩存管理功能。自spring版本3.1起加入了該註解。其做用至關於spring配置文件中的cache manager標籤。
五、@PathVariable:路徑變量註解,@RequestMapping中用{}來定義url部分的變量名,如:
一樣能夠支持變量名加正則表達式的方式,變量名:[正則表達式]。
servcie層註解
一、@Service:這個註解用來標記業務層的組件,咱們會將業務邏輯處理的類都會加上這個註解交給spring容器。事務的切面也會配置在這一層。當讓 這個註解不是必定要用。有個泛指組件的註解,當咱們不能肯定具體做用的時候 能夠用泛指組件的註解託付給spring容器。
二、@Resource:@Resource和@Autowired同樣均可以用來裝配bean,均可以標註字段上,或者方法上。 @resource註解不是spring提供的,是屬於J2EE規範的註解。
兩個以前的區別就是匹配方式上有點不一樣,@Resource默認按照名稱方式進行bean匹配,@Autowired默認按照類型方式進行bean匹配。
持久層註解
一、@Repository:@Repository註解類做爲DAO對象,管理操做數據庫的對象。
總得來看,@Component, @Service, @Controller, @Repository是spring註解,註解後能夠被spring框架所掃描並注入到spring容器來進行管理
@Component是通用註解,其餘三個註解是這個註解的拓展,而且具備了特定的功能。
經過這些註解的分層管理,就能將請求處理,義務邏輯處理,數據庫操做處理分離出來,爲代碼解耦,也方便了之後項目的維護和開發。
因此咱們在正常開發中,若是能用@Service, @Controller, @Repository其中一個標註這個類的定位的時候,就不要用@Component來標註。
二、@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/
本文做者:緱應奎
文章來源:宜信技術學院