1. 程式人生 > >Springboot常用註解小結

Springboot常用註解小結

@Autowired

自動裝配註釋,作為:實現自動裝配,使用範圍:用在成員變數、方法以及建構函式上。

用在類屬性上,可以免寫setter方法

優點:可以免除在配置檔案中新增bean的注入資訊,等價於上下文通過ByType的方式,在配置檔案中查詢相應的bean,並注入到該類中。

<!-- 該 BeanPostProcessor 將自動起作用,對標註@Autowired 的 Bean 進行自動注入 -->

   <bean class="org.springframework.beans.factory.annotation.

       AutowiredAnnotationBeanPostProcessor"/>

引數:required

當不能確定 Spring 容器中一定擁有某個類的Bean 時,可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false),這等於告訴 Spring:在找不到匹配 Bean 時也不報錯。當我們在xml裡面為類配置注入物件時,會發現xml檔案會越來越臃腫,維護起來很麻煩。這時候我們可以使用註解這種機制來為類配置注入物件。

@Resource和@Autowired的區別

java為我們提供了javax.annotation.Resource這個註解。

spring框架提供了org.springframework.beans.factory.annotation.Autowired。

一般情況下我們使用javax.annotation.Resource這個註解,因為這樣我們就能實現和spring框架的解藕(不能認同,因為註解處理器還是Spring提供的)。

@Resource可以作用於欄位和函式上。當作用於欄位上的時候,如果我們只是簡單的這樣寫

@Resource

PersonDao p;

這時候spring注入p的過程是

1:先查詢xml中是否有id為p的元素

2:如果沒有找到,則看是否有name屬性(@Resourcename=“”),有則查詢name

3:否則查詢PersonDao型別的元素

@Resource可作用於set函式上。

例如:

@Resource

public void setP(PersonDao p) {

 this.p = p;

}

@Autowired註解是根據型別進行查詢,比如

@Autowired

PersonDao p

他會去xml檔案裡查詢型別為PersonDao的元素

使用 @Qualifier 註釋指定注入 Bean 的名稱

@Qualifier("office") 中的 office 是 Bean 的名稱,所以 @Autowired 和@Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。@Autowired 可以對成員變數、方法以及建構函式進行註釋,而@Qualifier 的標註物件是成員變數、方法入參、建構函式入參。

@Autowired

public voidsetOffice(@Qualifier("office")Office office) {

   this.office = office;

}

@Qualifier 只能和 @Autowired 結合使用,是對 @Autowired 有益的補充。一般來講,@Qualifier 對方法簽名中入參進行註釋會降低程式碼的可讀性,而對成員變數註釋則相對好一些。

@Resource 的作用相當於 @Autowired,只不過 @Autowired 按 byType 自動注入,面@Resource 預設按 byName 自動注入罷了。@Resource 有兩個屬性是比較重要的,分別是 name 和 type,Spring 將@Resource 註釋的 name 屬性解析為 Bean 的名字,而 type 屬性則解析為 Bean 的型別。所以如果使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。如果既不指定 name 也不指定 type 屬性,這時將通過反射機制使用 byName 自動注入策略。

Spring 容器中的 Bean 是有生命週期的,Spring允許在 Bean 在初始化完成後以及 Bean 銷燬前執行特定的操作,您既可以通過實現 InitializingBean/DisposableBean 介面來定製初始化之後 / 銷燬之前的操作方法,也可以通過 <bean> 元素的 init-method/destroy-method 屬性指定初始化之後 / 銷燬之前呼叫的操作方法。

JSR-250 為初始化之後/銷燬之前方法的指定定義了兩個註釋類,分別是 @PostConstruct 和 @PreDestroy,這兩個註釋只能應用於方法上。標註了@PostConstruct 註釋的方法將在類例項化後呼叫,而標註了 @PreDestroy 的方法將在類銷燬之前呼叫。

我們知道,不管是通過實現 InitializingBean/DisposableBean 介面,還是通過<bean> 元素的init-method/destroy-method 屬性進行配置,都只能為 Bean 指定一個初始化 / 銷燬的方法。但是使用 @PostConstruct 和 @PreDestroy 註釋卻可以指定多個初始化/ 銷燬方法,那些被標註 @PostConstruct 或@PreDestroy 註釋的方法都會在初始化 /銷燬時被執行。

@Component

用於標識該類為bean。對於Spring,在XML檔案中啟動Spring的自動掃描功能後,目錄下的帶有此註解的類都會自動建立bean,這樣就不再需要在 XML 中顯式使用 <bean/> 進行Bean 的配置。

對於Springboot,由於不用配置XML,所以此註解成為了標註bean的重要手段。

除了@Component以外,還有幾個註解,都可以用來標識bean,並且這些註解都有特別的含義,當元件不好歸類的時候,我們可以使用@Component進行標註。

@Repository

具體只需將該註解標注在 DAO上即可。同時,為了讓Spring 能夠掃描類路徑中的類並識別出 @Repository 註解,需要在 XML 配置檔案中啟用Bean 的自動掃描功能,這可以通過<context:component-scan/>實現。如下所示(注意紅色字型):

 // 首先使用 @Repository DAO 類宣告為 Bean

 package bookstore.dao;

 @Repository

 publicclass UserDaoImpl implements UserDao{ …… }

// 其次,在 XML 配置檔案中啟動 Spring 的自動掃描功能

 <beans … >

     <context:component-scanbase-package=”bookstore.dao” />

</beans>

Spring 在容器初始化時將自動掃描base-package 指定的包及其子包下的所有 class檔案,所有標註了 @Repository 的類都將被註冊為 Spring Bean。

為什麼 @Repository 只能標註在 DAO 類上呢?這是因為該註解的作用不只是將類識別為Bean,同時它還能將所標註的類中丟擲的資料訪問異常封裝為 Spring 的資料訪問異常型別。 Spring本身提供了一個豐富的並且是與具體的資料訪問技術無關的資料訪問異常結構,用於封裝不同的持久層框架丟擲的異常,使得異常獨立於底層的框架。

@Service

服務層元件,用於標註業務層元件,表示定義一個bean,自動根據bean的類名例項化一個首寫字母為小寫的bean,例如Chinese例項化為chinese,如果需要自己改名字則:@Service("你自己改的bean名")。

@Controller

用於標註控制層元件(如struts中的action) 

@Controller和@RestController的區別?

官方文件:

@RestController is a stereotype annotationthat combines @ResponseBody and @Controller.

意思是:

@RestController註解相當於@ResponseBody+ @Controller合在一起的作用。

1)如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,配置的檢視解析器InternalResourceViewResolver不起作用,返回的內容就是Return裡的內容。

例如:本來應該到success.jsp頁面的,則其顯示success.

2)如果需要返回到指定頁面,則需要用@Controller配合檢視解析器InternalResourceViewResolver才行。

3)如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。

說明:@Controller,方法返回String,實際上是返回stringcontent.jsp,並且把model中的內容賦值到jsp中。詳見spring mvc的註解,及簡單例子部分。如果在專案中,找不到該jsp,就會報錯。

@RestController,方法返回String,就真的是返回String,這個String一般是json內容,前端獲取到這些內容後,解析到當前頁面上(前端開啟一個頁面,使用ajax非同步載入),從而實現前後端的完全分離。

@Transactional

確保對資料庫的寫入是一個transaction(一個事務,要麼全部完成,要麼全部回滾)。此註解有很多屬性可以設定,見下文。具體可以看下這篇文章:https://www.cnblogs.com/sonng/p/6591319.html

@Transactianal註解有一些屬性,見Spring-Framework-Reference Table17.3 Transactional-settings

@Transactional(propagation=Propagation.REQUIRED)           //控制事務傳播。預設是Propagation.REQUIRED

@Transactional(isolation=Isolation.DEFAULT)                //控制事務隔離級別。預設跟資料庫的預設隔離級別相同

@Transactional(readOnly=false)                             //控制事務可讀寫還是隻可讀。預設可讀寫

@Transactional(timeout=30)                           //控制事務的超時時間,單位秒。預設跟資料庫的事務控制系統相同,又說是30

@Transactional(rollbackFor=RuntimeException.class)         //控制事務遇到哪些異常才會回滾。預設是RuntimeException

@Transactional(rollbackForClassName=RuntimeException)      //同上

@Transactional(noRollbackFor=NullPointerException.class)   //控制事務遇到哪些異常不會回滾。預設遇到非RuntimeException不會回滾

@Transactional(noRollbackForClassName=NullPointerException)//同上

此註解需要注意的地方:

1. 在需要事務管理的地方加@Transactional註解。@Transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。

[email protected] 註解只能應用到 public 可見度的方法上。如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 註解,它也不會報錯,但是這個被註解的方法將不會展示已配置的事務設定。

3. 注意僅僅@Transactional 註解的出現不足於開啟事務行為,它僅僅是一種元資料。必須在配置檔案中使用配置元素,才真正開啟了事務行為。

4. 通過 元素的"proxy-target-class" 屬性值來控制是基於介面的還是基於類的代理被建立。如果 "proxy-target-class" 屬值被設定為"true",那麼基於類的代理將起作用(這時需要CGLIB庫cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 屬值被設定為"false" 或者這個屬性被省略,那麼標準的JDK基於介面的代理將起作用。

@RequestMapping

可以應用於類、方法上,用於對映url。如果一個類,映射了一個url(假設為/class),其方法又映射了一個URL(假設為/method)。那麼這個方法的完整URL為/class/method。

RequestMapping(value=”/view”,method=RequestMethod.GET,params=”add”):主要用於方法註解,用於定義該方法接收哪個路徑以及型別,必須包含什麼引數

Value可以寫集合,例如@RequestMapping(value={”/view”,“/hello”})

@PathVairable

獲取url的資料,在方法的引數中使用,獲取的是url的內容,如下圖localhost:8080/say/123,獲取了123,如果value的值是”/{id}/say”,也可以獲取到id的值

@RequestParam

獲取引數值,如果URL為:localhost:8080/say/?id=23,則獲取id。Post同樣可以獲取。

進一步設定,可以設定是否必須,以及預設值,預設值一定是string

@GetMapping和@PostMapping

1、 @GetMapping(value =“/say”)等價於

@RequestMapping(value=”/say”,method= RequestMethod.GET)

2、 @PostMapping(value= “/say”)等價於

@RequestMapping(value=”/say”,method= RequestMethod.POST)

@ModuleAttribute

用於方法的引數中,標識該引數(entity)是用來承接request的同名引數。

@ResponseBody

@ResponseBody作用在方法上,@ResponseBody表示該方法的返回結果直接寫入 HTTP response body 中,一般在非同步獲取資料時使用【也就是AJAX】,在使用 @RequestMapping後,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 後返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。比如非同步獲取 json 資料,加上 @ResponseBody 後,會直接返回 json 資料。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個物件。

@RequestBody

作用在形參列表上,用於將前臺傳送過來固定格式的資料【xml 格式或者 json等】封裝為對應的 JavaBean 物件,封裝時使用到的一個物件是系統預設配置的 HttpMessageConverter進行解析,然後封裝到形參上。

@SpringBootApplication

Springboot專有註解,用於標註該類為專案的啟動類,入口類。

@Aspect

表示該類是AOP類

要想把一個類變成切面類,需要兩步,

①在類上使用 @Component 註解把切面類加入到IOC容器中

②在類上使用 @Aspect 註解使之成為切面類

@Pointcut

用於方法層面的註解,方法返回型別必須為void,用於標註切入點。下面提到的註解,其value值[email protected]指定的方法,即可將切面方法與切入點關聯。

execution 匹配方法執行的連線點

within 限定匹配特定型別的連線點

this 匹配特定連結點的bean引用是指定型別的例項的限制

target 限定匹配特點連結點的目標物件引數是指定型別的例項

args 限定匹配特點連結點的引數是給定型別的例項。

下面的方法都有一個引數,value = "methodName()",methodName方法必須有@Pointcut註解。從而實現關聯。

@Before

表示該切面是在方法執行前處理

@After

表示該切面是在方法執行後處理

@AfterReturning

返回之後處理,可以用來記錄返回內容

@NotNull

IDEA建立的註解,用於標註方法的引數不能為空,使用註解後,呼叫此方法時會檢測引數是否為空。需要引入IDEA的jar包

@ControllerAdvice

在spring 3.2中,新增了@ControllerAdvice 註解,可以用於定義@ExceptionHandler、@InitBinder、@ModelAttribute,並應用到所有@RequestMapping中。

簡單來說,@controllerAdvice包含了@Component,即啟動程式時會建立例項。這個註解用在類層面,有了這個註解後,這類裡面的方法可以標註以下3個註解。詳細可以看此文章:https://www.cnblogs.com/magicalSam/p/7198420.html

@ExceptionHandler

全域性異常捕捉處理

@InitBinder

應用到所有@RequestMapping註解方法,在其執行之前初始化資料繫結器

@ModelAttribute

把值繫結到Model中,使全域性@RequestMapping可以獲取到該值

@RunWith(SpringRunner.class)

表示Junit要在單元測試跑spring

@SpringBootTest

啟動整個springboot工程

@Valid

使用在傳入引數中,用於表單驗證。使用此註解後,入參要新增一個引數:BindingResult bindingResult。一般來說,此註解需要先做前置處理。可以參考此文章:http://blog.csdn.net/xzmeasy/article/details/76098188

@Configuration

@Configuration用於定義配置類,可替換xml配置檔案,被註解的類內部包含有一個或多個被@Bean註解的方法,這些方法將會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,並用於構建bean定義,初始化Spring容器。

@Bean

@Bean是一個方法級別上的註解,主要用在@Configuration註解的類裡,也可以用在@Component註解的類裡。新增的bean的id為方法名。Bean有很多屬性,例如name,id,class,initMethod,destoryMethod等。

@Scope

用於定義@Bean的作用域。預設是singleton。寫法:@Scope("prototype")

singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個例項。

prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean例項。

request:對於每次HTTP請求,使用request定義的Bean都將產生一個新例項,即每次HTTP請求將會產生不同的Bean例項。只有在Web應用中使用Spring時,該作用域才有效。

session:對於每次HTTP Session,使用session定義的Bean豆漿產生一個新例項。同樣只有在Web應用中使用Spring時,該作用域才有效。

globalsession:每個全域性的HTTP Session,使用session定義的Bean都將產生一個新例項。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效。

@Description

用於描述該bean。估計是用於doc生成。@Description("Provides abasic example of a bean")