歡迎光臨
每天分享高質量文章

Spring 中註解大全和應用

點選上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 

來源:http://t.cn/RFBJugV

  1. @Controller

  2. @RestController:

  3. @Service

  4. @Autowired

  5. @RequestMapping

  6. @RequestParam

  7. @ModelAttribute

  8. @Cacheable

  9. @CacheEvict

  10. @Resource

  11. @PostConstruct

  12. @PreDestroy

  13. @Repository

  14. @Component  

  15. @Scope

  16. @SessionAttributes

  17. @Required

  18. @Qualifier

@Controller

標識一個該類是Spring MVC controller處理器,用來建立處理http請求的物件.

1@Controller
2public class TestController {
3        @RequestMapping("/test")
4        public String test(Map map){
5
6            return "hello";
7        }
8}

@RestController

Spring4之後加入的註解,原來在@Controller中傳回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,預設傳回json格式。

1@RestController
2public class TestController {
3        @RequestMapping("/test")
4        public String test(Map map){
5
6            return "hello";
7        }
8}

@Service

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

@Autowired

用來裝配bean,都可以寫在欄位上,或者方法上。
預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,例如:@Autowired(required=false)

@RequestMapping

類定義處: 提供初步的請求對映資訊,相對於 WEB 應用的根目錄。
方法處: 提供進一步的細分對映資訊,相對於類定義處的 URL。

用過RequestMapping的同學都知道,他有非常多的作用,因此詳細的用法
我會在下一篇文章專門講述,請關註公眾號哦,以免錯過。

@RequestParam

用於將請求引數區資料對映到功能處理方法的引數上
例如

1public Resp test(@RequestParam Integer id){
2        return Resp.success(customerInfoService.fetch(id));
3    }

這個id就是要接收從介面傳遞過來的引數id的值的,如果介面傳遞過來的引數名和你接收的不一致,也可以如下

1public Resp test(@RequestParam(value="course_id") Integer id){
2        return Resp.success(customerInfoService.fetch(id));
3    }

其中course_id就是介面傳遞的引數,id就是對映course_id的引數名

@ModelAttribute

使用地方有三種:

1. 標記在方法上。

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

A.在有傳回的方法上:

當ModelAttribute設定了value,方法傳回的值會以這個value為key,以引數接受到的值作為value,存入到Model中,如下麵的方法執行之後,最終相當於 model.addAttribute(“user_name”, name);假如 @ModelAttribute沒有自定義value,則相當於
model.addAttribute(“name”, name);

1@ModelAttribute(value="user_name")
2    public String before2(@RequestParam(required = false) String name, Model model) {
3        System.out.println("進入了2:" + name);
4        return name;
5    }
B.在沒傳回的方法上:

需要手動model.add方法

1    @ModelAttribute
2    public void before(@RequestParam(required = false) Integer age, Model model) {
3        model.addAttribute("age", age);
4        System.out.println("進入了1:" + age);
5    }

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

 1@RequestMapping(value="/mod")
2    public Resp mod(
3            @RequestParam(required = false)
 String name,
4            @RequestParam(required = false) Integer age, 
5            Model model)
{
6        System.out.println("進入mod");
7        System.out.println("引數接受的數值{name="+name+";age="+age+"}");
8        System.out.println("model傳過來的值:"+model);
9        return Resp.success("1");
10    }

在瀏覽器中輸入訪問地址並且加上引數:
http://localhost:8081/api/test/mod?name=我是小菜&age;=12

最終輸出如下:

1進入了1:40
2進入了2:我是小菜
3進入mod
4引數接受的數值{name=我是小菜;age=12}
5model傳過來的值:{age=40, user_name=我是小菜}

2. 標記在方法的引數上。

標記在方法的引數上,會將客戶端傳遞過來的引數按名稱註入到指定物件中,並且會將這個物件自動加入ModelMap中,便於View層使用.
我們在上面的類中加入一個方法如下

 1@RequestMapping(value="/mod2")
2    public Resp mod2(@ModelAttribute("user_name") String user_name, 
3            @ModelAttribute("name") String name,
4            @ModelAttribute("age") Integer age,Model model)
{
5        System.out.println("進入mod2");
6        System.out.println("user_name:"+user_name);
7        System.out.println("name:"+name);
8        System.out.println("age:"+age);
9        System.out.println("model:"+model);
10        return Resp.success("1");
11    }

在瀏覽器中輸入訪問地址並且加上引數:
http://localhost:8081/api/test/mod2?name=我是小菜&age;=12
最終輸出:

1進入了1:40
2進入了2:我是小菜
3進入mod2
4user_name:我是小菜
5name:我是小菜
6age:40
7model:{user_name=我是小菜, org.springframework.validation.BindingResult.user_name=org.springframework.validation.BeanPropertyBindingResult: 0 errors, name=我是小菜, org.springframework.validation.BindingResult.name=org.springframework.validation.BeanPropertyBindingResult: 0 errors, age=40, org.springframework.validation.BindingResult.age=org.springframework.validation.BeanPropertyBindingResult: 0 errors}

從結果就能看出,用在方法引數中的@ModelAttribute註解,實際上是一種接受引數並且自動放入Model物件中,便於使用。

@Cacheable

用來標記快取查詢。可用用於方法或者類中,

當標記在一個方法上時表示該方法是支援快取的,
當標記在一個類上時則表示該類所有的方法都是支援快取的。

引數串列

引數 解釋 例子
value 名稱 @Cacheable(value={”c1”,”c2”}
key key @Cacheable(value=”c1”,key=”#id”)
condition 條件 @Cacheable(value=”c1”,condition=”#id=1”)

比如@Cacheable(value=”UserCache”) 標識的是當呼叫了標記了這個註解的方法時,邏輯預設加上從快取中獲取結果的邏輯,如果快取中沒有資料,則執行使用者編寫查詢邏輯,查詢成功之後,同時將結果放入快取中。
但凡說到快取,都是key-value的形式的,因此key就是方法中的引數(id),value就是查詢的結果,而名稱空間UserCache是在spring*.xml中定義.

1@Cacheable(value="UserCache")// 使用了一個快取名叫 accountCache   
2public Account getUserAge(int id) {  
3     //這裡不用寫快取的邏輯,直接按正常業務邏輯走即可,
4     //快取透過切麵自動切入  
5    int age=getUser(id);   
6     return age;   
7

@CacheEvict

用來標記要清空快取的方法,當這個方法被呼叫後,即會清空快取。@CacheEvict(value=”UserCache”)

引數串列

引數 解釋 例子
value 名稱 @CachEvict(value={”c1”,”c2”}
key key @CachEvict(value=”c1”,key=”#id”)
condition 快取的條件,可以為空
allEntries 是否清空所有快取內容 @CachEvict(value=”c1”,allEntries=true)
beforeInvocation 是否在方法執行前就清空 @CachEvict(value=”c1”,beforeInvocation=true)

@Resource

@Resource的作用相當於@Autowired
只不過@Autowired按byType自動註入,
而@Resource預設按 byName自動註入罷了。

@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動註入策略,而使用type屬性時則使用byType自動註入策略。如果既不指定name也不指定type屬性,這時將透過反射機制使用byName自動註入策略。

@Resource裝配順序:

  1. 如果同時指定了name和type,則從Spring背景關係中找到唯一匹配的bean進行裝配,找不到則丟擲異常

  2. 如果指定了name,則從背景關係中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常

  3. 如果指定了type,則從背景關係中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常

  4. 如果既沒有指定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 的作用域。
預設值是單例

  1. singleton:單例樣式,全域性有且僅有一個實體

  2. prototype:原型樣式,每次獲取Bean的時候會有一個新的實體

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

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

  5. global session:只在portal應用中有用,給每一個 global http session 新建一個Bean實體。

@SessionAttributes

預設情況下Spring MVC將模型中的資料儲存到request域中。當一個請求結束後,資料就失效了。如果要跨頁面使用。那麼需要使用到session。而@SessionAttributes註解就可以使得模型中的資料儲存一份到session域中

引數:

  1. names:這是一個字串陣列。裡面應寫需要儲存到session中資料的名稱。

  2. types:根據指定引數的型別,將模型中對應型別的引數儲存到session中

  3. value:和names是一樣的。

 1@Controller
2@SessionAttributes(value={"names"},types={Integer.class})
3public class ScopeService {
4        @RequestMapping("/testSession")
5        public String test(Map map){
6            map.put("names", Arrays.asList("a","b","c"));
7            map.put("age"12);
8            return "hello";
9        }
10}

@Required

適用於bean屬性setter方法,並表示受影響的bean屬性必須在XML配置檔案在配置時進行填充。否則,容器會丟擲一個BeanInitializationException異常。

@Qualifier

當你建立多個具有相同型別的 bean 時,並且想要用一個屬性只為它們其中的一個進行裝配,在這種情況下,你可以使用 @Qualifier 註釋和 @Autowired 註釋透過指定哪一個真正的 bean 將會被裝配來消除混亂。



如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢

目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 伺服器

16. P2P 伺服器

17. HTTP 伺服器

18. 序列化 Serialization

19. 叢集容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing

… 一共 69+ 篇

目前在知識星球更新了《Netty 原始碼解析》目錄如下:

01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap

05. 事件輪詢 EventLoop

06. 通道管道 ChannelPipeline

07. 通道 Channel

08. 位元組緩衝區 ByteBuf

09. 通道處理器 ChannelHandler

10. 編解碼 Codec

11. 工具類 Util

… 一共 61+ 篇

目前在知識星球更新了《資料庫物體設計》目錄如下:


01. 商品模組
02. 交易模組
03. 營銷模組
04. 公用模組

… 一共 17+ 篇


目前在知識星球更新了《Spring 原始碼解析》目錄如下:


01. 除錯環境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 載入

04. IoC BeanDefinition 註冊

05. IoC Bean 獲取

06. IoC Bean 生命週期

… 一共 35+ 篇


原始碼不易↓↓↓

點贊支援老艿艿↓↓


贊(0)

分享創造快樂