由於要看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
public @interface 註解名 {定義體}
複製代碼
上面試一些基本概念點,關注註解其餘的一些特性和用法就不細說了。直接看Spring中的註解吧。
@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 "";
}
複製代碼
指示註釋類是「組件」。 當使用基於註釋的配置和類路徑掃描時,這些類被認爲是自動檢測的候選對象。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
String value() default "";
}
複製代碼
使用過Spring mvc的小夥伴對於這個註解確定不陌生。@Controller表示註釋的類是「控制器」(例如Web控制器)。這個註解做爲@Component的一個特定方式存在,容許經過類路徑掃描來自動檢測實現類。一般狀況下會結合RequestMapping註解使用。從它的定義層面來看,這個註解只能用於接口或者類上面,不能用於方法或者屬性字段上面。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
String value() default "";
}
複製代碼
表示註釋類是一個「服務」,最初由Domain-Driven Design (Evans,2003)定義爲「做爲模型中獨立的接口提供的操做,沒有封裝狀態」。
在通常狀況下,咱們把他用在標準咱們的service服務接口的實現類上面,實際上這至關於縮小它們的語義和適當的使用。
@Service這個註釋做爲 @Component的一個特例,容許經過類路徑掃描來自動檢測實現類。
@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組件
@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是一個用來處理地址映射請求的註解,從定義能夠看出,可做用於方法或者類上。
它包括了幾個屬性:
其餘的幾個沒怎麼用過,確實不瞭解,有知道的小夥伴,歡迎留言。
@ResponseBody這個我通常是用在作異步請求調用的方法上來使用的。由於在使用@RequestMapping後,返回值一般解析爲跳轉路徑。加上@responsebody後,返回結果直接寫入HTTP response body中,不會被解析爲跳轉路徑。
對於異步請求,咱們不但願返回解析視圖,二是但願響應的結果是json數據,那麼加上@responsebody後,就會直接返回json數據。
Autowired就是自動裝配的意思,其做用是爲了消除代碼Java代碼裏面的getter/setter與bean屬性中的property。固然,getter看我的需求,若是私有屬性須要對外提供的話,就應該保留。
@Autowired默認按類型匹配的方式,在容器查找匹配的Bean,當有且僅有一個匹配的Bean時,Spring將其注入@Autowired標註的變量中。
可是當接口存在兩個實現類的時候必須使用@Qualifier指定注入哪一個實現類,不然能夠省略,只寫@Autowired。
@Qualifier用於指定注入Bean的名稱,就是上面說到的,若是容器中有一個以上匹配的Bean,則能夠經過@Qualifier註解限定Bean的名稱。
這個註解不是Spring的,放在這裏是爲了和@Autowired作一個區別。 @Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。
當使用@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註解有兩個屬性: value、required;
舉個例子:
@RequestMapping("/t_rparam1")
public String t_rparam1(@RequestParam Long userId) {
//do something
}
@RequestMapping("/t_rparam2")
public String t_rparam2(Long userId) {
//do something
}
複製代碼
固然咱們也能夠設置 @RequestParam 裏面的required爲false(默認爲true 表明必須帶參數) 這樣t_rparam1就跟t_rparam2是同樣的了。
利用@RequestHeader 註解能夠把Request請求header部分的值綁定到方法的參數上。
@RequestMapping("/t_heander")
public void getRequestHeaderTest(HttpServletRequest request, HttpServletResponse response, @RequestHeader("Accept-Encoding")String encoding) {
//do something
}
複製代碼
@CookieValue就是把Request header中cookie的值綁定到方法的參數上。好比說咱們的cookie以下:
Cookie:JSESSIONID=ka8A5L5t7WTUPXbaLupBieqOdmc0ZpD5MyKvea6oQr7JJSIZzM;userId=001;sysFlag=glmapper
複製代碼
獲取以下:
@RequestMapping("/t_cookie")
public void getCookieValueTest(@CookieValue("JSESSIONID") String cookie) {
//do something
}
複製代碼
@RequestBody這個註解經常使用來處理Content-Type不是application/x-www-form-urlencoded編碼的內容,好比說:application/json, application/xml等等;這個和ResonseBody能夠反過來理解。
方法上
一般用來在處理@RequestMapping以前,爲請求綁定須要從後臺查詢的model;
參數上
用來經過名稱對應,把相應名稱的值綁定到註解的參數bean上;