Spring源碼系列:註解說明

由於要看Spring中註解的具體定義,因此在說以前,先來簡單說下JAVA中註解的一些基本知識。html

元註解

什麼是元註解呢,就是註解的註解。java中提供瞭如下幾種:java

  • @Target面試

    註解的做用域描述json

    public enum ElementType {
        /** 類, 接口 或者枚舉 */
        TYPE,
        /** 字段 */
        FIELD,
        /** 方法 */
        METHOD,
        /** 參數 */
        PARAMETER,
        /** 構造方法 */
        CONSTRUCTOR,
        /** 局部變量 */
        LOCAL_VARIABLE,
        /** 註解類型 */
        ANNOTATION_TYPE,
        /** 包 */
        PACKAGE
    }
    複製代碼
  • @Retentionbash

    生命週期描述cookie

    public enum RetentionPolicy {
        /** * 在原文件中有效,被編譯器丟棄。 */
        SOURCE,
        /** * 在class文件有效,可能會被虛擬機忽略。 */
        CLASS,
        /** * 在運行時有效。 */
        RUNTIME
    }
    複製代碼
  • @Inheritedmvc

    標識性的元註解,它容許子註解繼承它。app

  • @Documented異步

    用於標準生成javadoc時會包含的註解。ui

JAVA中註解的定義方式

public @interface 註解名 {定義體}
複製代碼

上面試一些基本概念點,關注註解其餘的一些特性和用法就不細說了。直接看Spring中的註解吧。

一、@Component

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Component {

    /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any */
    String value() default "";

}
複製代碼

指示註釋類是「組件」。 當使用基於註釋的配置和類路徑掃描時,這些類被認爲是自動檢測的候選對象。

二、@Controller

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    String value() default "";
}
複製代碼

使用過Spring mvc的小夥伴對於這個註解確定不陌生。@Controller表示註釋的類是「控制器」(例如Web控制器)。這個註解做爲@Component的一個特定方式存在,容許經過類路徑掃描來自動檢測實現類。一般狀況下會結合RequestMapping註解使用。從它的定義層面來看,這個註解只能用於接口或者類上面,不能用於方法或者屬性字段上面。

三、@Service

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
	String value() default "";
}
複製代碼

表示註釋類是一個「服務」,最初由Domain-Driven Design (Evans,2003)定義爲「做爲模型中獨立的接口提供的操做,沒有封裝狀態」。

在通常狀況下,咱們把他用在標準咱們的service服務接口的實現類上面,實際上這至關於縮小它們的語義和適當的使用。

@Service這個註釋做爲 @Component的一個特例,容許經過類路徑掃描來自動檢測實現類。

四、@Repository

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {
    /** * The value may indicate a suggestion for a logical component name, * to be turned into a Spring bean in case of an autodetected component. * @return the suggested component name, if any */
    String value() default "";
}
複製代碼

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

五、@RequestMapping

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";
    
    @AliasFor("path")
    String[] value() default {};
    
    @AliasFor("value")
    String[] path() default {};
    
    RequestMethod[] method() default {};
    
    String[] params() default {};
    
    String[] headers() default {};
    
    String[] consumes() default {};
    
    String[] produces() default {};

}
複製代碼

@RequestMapping是一個用來處理地址映射請求的註解,從定義能夠看出,可做用於方法或者類上。

  • 用於類上,大多數是爲了進行區分controller
  • 用於方法上則是對方法進行註解以產生訪問的路徑。

它包括了幾個屬性:

  • value 用於設置方法或者類的映射路徑,能夠直接寫路徑。咱們一般都是直接寫,例如:@RequestMapping("/XXX");
  • method 用於指定請求的方法,能夠設置單個或多個,若是請求方法不知足條件則會請求失敗。
  • params 指定request中必須包含某些參數值是,才讓該方法處理。
  • name 此映射指定一個名稱
  • path 僅在Servlet環境中:路徑映射URI(例如「/myPath.do」)。也支持Ant風格的路徑模式(例如「/myPath/*.do」)。在方法級別,在類型級別表示的主映射內支持相對路徑(例如「edit.do」)。 路徑映射URI可能包含佔位符(例如「/ $ {connect}」)
  • consumes 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
  • produces 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
  • headers 指定request中必須包含某些指定的header值,才能讓該方法處理請求。

其餘的幾個沒怎麼用過,確實不瞭解,有知道的小夥伴,歡迎留言。

六、@ResponseBody

@ResponseBody這個我通常是用在作異步請求調用的方法上來使用的。由於在使用@RequestMapping後,返回值一般解析爲跳轉路徑。加上@responsebody後,返回結果直接寫入HTTP response body中,不會被解析爲跳轉路徑。

對於異步請求,咱們不但願返回解析視圖,二是但願響應的結果是json數據,那麼加上@responsebody後,就會直接返回json數據。

七、@Autowired

Autowired就是自動裝配的意思,其做用是爲了消除代碼Java代碼裏面的getter/setter與bean屬性中的property。固然,getter看我的需求,若是私有屬性須要對外提供的話,就應該保留。

@Autowired默認按類型匹配的方式,在容器查找匹配的Bean,當有且僅有一個匹配的Bean時,Spring將其注入@Autowired標註的變量中。

可是當接口存在兩個實現類的時候必須使用@Qualifier指定注入哪一個實現類,不然能夠省略,只寫@Autowired。

八、@Qualifier

@Qualifier用於指定注入Bean的名稱,就是上面說到的,若是容器中有一個以上匹配的Bean,則能夠經過@Qualifier註解限定Bean的名稱。

九、@Resource

這個註解不是Spring的,放在這裏是爲了和@Autowired作一個區別。 @Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。

十、@PathVariable

當使用@RequestMapping URI template 樣式映射時, 即 someUrl/{paramId}, 這時的paramId可經過 @Pathvariable註解綁定它傳過來的值到方法的參數上。

@RequestMapping("/user/{userId}")
public ModelAndView userCenter(HttpServletRequest request, HttpServletResponse response, @PathVariable String userId){
    //do something 
}
複製代碼

若是方法參數名稱和須要綁定的uri template中變量名稱不一致,須要在@PathVariable("name")指定uri template中的名稱。

十一、@RequestParam

@RequestParam註解有兩個屬性: value、required;

  • value用來指定要傳入值的id名稱
  • required用來指示參數是否必須綁定;

舉個例子:

@RequestMapping("/t_rparam1")  
public String t_rparam1(@RequestParam Long userId) {  
    //do something 
}  

@RequestMapping("/t_rparam2")  
public String t_rparam2(Long userId) {  
    //do something 
}
複製代碼
  • t_rparam1 必須帶有參數,也就是說你直接輸入localhost:8080/t_rparam1 會報錯只能輸入localhost:8080/t_rparam1?userId=? 才能執行相應的方法
  • t_rparam2 可帶參數也可不帶參數;也就是說輸入localhost:8080/t_rparam2和輸入 localhost:8080/t_rparam2?userId=?均可以正常運行

固然咱們也能夠設置 @RequestParam 裏面的required爲false(默認爲true 表明必須帶參數) 這樣t_rparam1就跟t_rparam2是同樣的了。

十二、@RequestHeader

利用@RequestHeader 註解能夠把Request請求header部分的值綁定到方法的參數上。

@RequestMapping("/t_heander")  
public void getRequestHeaderTest(HttpServletRequest request, HttpServletResponse response, @RequestHeader("Accept-Encoding")String encoding) {  
  
  //do something 
} 
複製代碼

1三、@CookieValue

@CookieValue就是把Request header中cookie的值綁定到方法的參數上。好比說咱們的cookie以下:

Cookie:JSESSIONID=ka8A5L5t7WTUPXbaLupBieqOdmc0ZpD5MyKvea6oQr7JJSIZzM;userId=001;sysFlag=glmapper
複製代碼

獲取以下:

@RequestMapping("/t_cookie")  
public void getCookieValueTest(@CookieValue("JSESSIONID") String cookie) {  
  //do something 
} 
複製代碼

1四、@RequestBody

@RequestBody這個註解經常使用來處理Content-Type不是application/x-www-form-urlencoded編碼的內容,好比說:application/json, application/xml等等;這個和ResonseBody能夠反過來理解。

1五、@ModelAttribute

  • 方法上

    一般用來在處理@RequestMapping以前,爲請求綁定須要從後臺查詢的model;

  • 參數上

    用來經過名稱對應,把相應名稱的值綁定到註解的參數bean上;

參考

  • 《Spring技術內幕》
  • https://www.cnblogs.com/FrankLei/p/6579843.html
相關文章
相關標籤/搜索