Spring 中的 18 個註解,你會幾個?

閱讀本文大概須要 4 分鐘。

做者:Java的小本家程序員


@Controller

標識一個該類是 Spring MVC controller 處理器,用來建立處理 http 請求的對象。spring

@RestController

Spring4 以後加入的註解,原來在 @Controller 中返回 json 須要 @ResponseBody 來配合,若是直接用 @RestController 替代 @Controller 就不須要再配置 @ResponseBody ,默認返回 json 格式。json

@Service

用於標註業務層組件,說白了就是加入你有一個用註解的方式把這個類注入到 Spring 配置中api

@Autowired

用來裝配 bean,均可以寫在字段上,或者方法上。
數組

默認狀況下必需要求依賴對象必須存在,若是要容許null值,能夠設置它的 required 屬性爲 false,例如:@Autowired(required=false)。瀏覽器

@RequestMapping

類定義處: 提供初步的請求映射信息,相對於 WEB 應用的根目錄。
緩存

方法處: 提供進一步的細分映射信息,相對於類定義處的 URL。服務器

@RequestParam

用於將請求參數區數據映射到功能處理方法的參數上
微信

例如session

這個 id 就是要接收從接口傳遞過來的參數 id 的值的,若是接口傳遞過來的參數名和你接收的不一致,也能夠以下:

其中 course_id 就是接口傳遞的參數,id 就是映射 course_id 的參數名

@ModelAttribute

使用地方有三種:

一、標記在方法上。

標記在方法上,會在每個 @RequestMapping 標註的方法前執行,若是有返回值,則自動將該返回值加入到 ModelMap 中。

(1) 在有返回的方法上:

當 ModelAttribute 設置了 value,方法返回的值會以這個 value 爲 key,以參數接受到的值做爲 value,存入到 Model 中,以下面的方法執行以後,最終至關於 model.addAttribute("user_name", name);

假如 @ModelAttribute 沒有自定義 value,則至關於 model.addAttribute("name", name);

(2) 在沒返回的方法上:

須要手動 model.add 方法:

咱們在當前類下建一個請求方法:

在瀏覽器中輸入訪問地址而且加上參數:

http://localhost:8081/api/test/mod?name=我是小菜&age=12

最終輸出以下:

二、標記在方法的參數上。

標記在方法的參數上,會將客戶端傳遞過來的參數按名稱注入到指定對象中,而且會將這個對象自動加入 ModelMap 中,便於 View 層使用。

咱們在上面的類中加入一個方法以下:

在瀏覽器中輸入訪問地址而且加上參數:

http://localhost:8081/api/test/mod2?name=我是小菜&age=12

最終輸出:

從結果就能看出,用在方法參數中的 @ModelAttribute 註解,其實是一種接受參數而且自動放入 Model 對象中,便於使用。

@Cacheable

用來標記緩存查詢。

可用用於方法或者類中,當標記在一個方法上時表示該方法是支持緩存的,當標記在一個類上時則表示該類全部的方法都是支持緩存的。

參數列表

好比 @Cacheable(value="UserCache") 標識的是當調用了標記了這個註解的方法時,邏輯默認加上從緩存中獲取結果的邏輯,若是緩存中沒有數據,則執行用戶編寫查詢邏輯,查詢成功以後,同時將結果放入緩存中。

但凡說到緩存,都是 key-value 的形式的,所以 key 就是方法中的參數(id),value 就是查詢的結果,而命名空間 UserCache 是在 spring*.xml中定義.

@CacheEvict

用來標記要清空緩存的方法,當這個方法被調用後,即會清空緩存。 @CacheEvict(value=」UserCache」)

參數列表

@Resource

@Resource 的做用至關於 @Autowired,只不過 @Autowired 按 byType 自動注入,而 @Resource 默認按 byName 自動注入罷了。

@Resource 有兩個屬性是比較重要的,分是 name 和 type,Spring 將 @Resource 註解的 name 屬性解析爲 bean 的名字,而 type 屬性則解析爲 bean 的類型。

因此若是使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性時則使用 byType 自動注入策略。

若是既不指定 name 也不指定 type 屬性,這時將經過反射機制使用 byName 自動注入策略。

@Resource 裝配順序:

一、若是同時指定了 name 和 type,則從 Spring 上下文中找到惟一匹配的 bean 進行裝配,找不到則拋出異常。

二、若是指定了 name,則從上下文中查找名稱(id)匹配的 bean 進行裝配,找不到則拋出異常。

三、若是指定了 type,則從上下文中找到類型匹配的惟一bean進行裝配,找不到或者找到多個,都會拋出異常。

四、若是既沒有指定 name,又沒有指定 type,則自動按照 byName 方式進行裝配;若是沒有匹配,則回退爲一個原始類型進行匹配,若是匹配則自動裝配。

@PostConstruct

用來標記是在項目啓動的時候執行這個方法,用來修飾一個非靜態的 void() 方法。

也就是 Spring 容器啓動時就執行,多用於一些全局配置、數據字典之類的加載。

被 @PostConstruct 修飾的方法會在服務器加載 Servlet 的時候運行,而且只會被服務器執行一次。

PostConstruct 在構造函數以後執行,init() 方法以前執行。PreDestroy() 方法在 destroy() 方法執行執行以後執行。

@PreDestroy

被 @PreDestroy 修飾的方法會在服務器卸載 Servlet 的時候運行,而且只會被服務器調用一次,相似於 Servlet 的 destroy() 方法。

被 @PreDestroy 修飾的方法會在 destroy() 方法以後運行,在 Servlet 被完全卸載以前

@Repository

用於標註數據訪問組件,即 DAO 組件

@Component

泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。

@Scope

用來配置 spring bean 的做用域,它標識 bean 的做用域。

默認值是單例

一、singleton:單例模式,全局有且僅有一個實例

二、prototype:原型模式,每次獲取 Bean 的時候會有一個新的實例

三、request:request 表示該針對每一次 HTTP 請求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP request 內有效

四、session:session 做用域表示該針對每一次 HTTP 請求都會產生一個新的 bean,同時該 bean 僅在當前 HTTP session 內有效

五、global session:只在 portal 應用中有用,給每個 global http session 新建一個 Bean 實例。

@SessionAttributes

默認狀況下 Spring MVC 將模型中的數據存儲到 request 域中。當一個請求結束後,數據就失效了。

若是要跨頁面使用,那麼須要使用到 session。

而 @SessionAttributes 註解就可使得模型中的數據存儲一份到 session 域中。

參數:

一、names:這是一個字符串數組。裏面應寫須要存儲到 session 中數據的名稱。

二、types:根據指定參數的類型,將模型中對應類型的參數存儲到 session 中

三、value:和 names 是同樣的。

@Required

適用於 bean 屬性 setter 方法,並表示受影響的 bean 屬性必須在 XML 配置文件在配置時進行填充。不然,容器會拋出一個 BeanInitializationException 異常。

@Qualifier

當你建立多個具備相同類型的 bean 時,而且想要用一個屬性只爲它們其中的一個進行裝配。

在這種狀況下,你可使用 @Qualifier 註釋和 @Autowired 註釋經過指定哪個真正的 bean 將會被裝配來消除混亂。


原文連接:

https://m.toutiaocdn.com/i6693736960273416712




·END·

程序員的成長之路

路雖遠,行則必至

本文原發於 同名微信公衆號「程序員的成長之路」,回覆「1024」你懂得,給個讚唄。

回覆 [ 520 ] 領取程序員最佳學習方式

回覆 [ 256 ] 查看 Java 程序員成長規劃


往期精彩回顧


相關文章
相關標籤/搜索