Spring注解大全

1沐扳、@Controller

在SpringMVC 中,控制器Controller 負(fù)責(zé)處理由DispatcherServlet 分發(fā)的請求禁荒,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個Model 丁逝,然后再把該Model 返回給對應(yīng)的View 進(jìn)行展示惊搏。在SpringMVC 中提供了一個非常簡便的定義Controller 的方法,你無需繼承特定的類或?qū)崿F(xiàn)特定的接口仪搔,只需使用@Controller 標(biāo)記一個類是Controller 瘾婿,然后使用@RequestMapping 和@RequestParam 等一些注解用以定義URL 請求和Controller 方法之間的映射,這樣的Controller 就能被外界訪問到烤咧。此外Controller 不會直接依賴于HttpServletRequest 和HttpServletResponse 等HttpServlet 對象偏陪,它們可以通過Controller 的方法參數(shù)靈活的獲取到。

@Controller 用于標(biāo)記在一個類上煮嫌,使用它標(biāo)記的類就是一個SpringMVC Controller 對象笛谦。分發(fā)處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了@RequestMapping 注解昌阿。@Controller 只是定義了一個控制器類饥脑,而使用@RequestMapping 注解的方法才是真正處理請求的處理器。單單使用@Controller 標(biāo)記在一個類上還不能真正意義上的說它就是SpringMVC 的一個控制器類懦冰,因為這個時候Spring 還不認(rèn)識它灶轰。那么要如何做Spring 才能認(rèn)識它呢?這個時候就需要我們把這個控制器類交給Spring 來管理刷钢。有兩種方式:

######(1)在SpringMVC 的配置文件中定義MyController 的bean 對象笋颤。

###### (2)在SpringMVC 的配置文件中告訴Spring 該到哪里去找標(biāo)記為@Controller 的Controller 控制器内地。


<bean class="com.host.app.web.controller.MyController"/>

< context:component-scan base-package = "com.host.app.web" />//路徑寫到controller的上一層(掃描包詳解見下面淺析)

2伴澄、@RequestMapping

RequestMapping是一個用來處理請求地址映射的注解赋除,可用于類或方法上。用于類上秉版,表示類中的所有響應(yīng)請求的方法都是以該地址作為父路徑贤重。

RequestMapping注解有六個屬性,下面我們把她分成三類進(jìn)行說明(下面有相應(yīng)示例)清焕。

1并蝗、 value, method秸妥;

value: 指定請求的實際地址滚停,指定的地址可以是URI Template 模式(后面將會說明);

method: 指定請求的method類型粥惧, GET键畴、POST、PUT突雪、DELETE等起惕;

2、consumes咏删,produces

consumes: 指定處理請求的提交內(nèi)容類型(Content-Type)惹想,例如application/json, text/html;

produces: 指定返回的內(nèi)容類型,僅當(dāng)request請求頭中的(Accept)類型中包含該指定類型才返回督函;

3嘀粱、params,headers

params: 指定request中必須包含某些參數(shù)值是辰狡,才讓該方法處理锋叨。

headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求宛篇。

3娃磺、@Resource和@Autowired

@Resource和@Autowired都是做bean的注入時使用,其實@Resource并不是Spring的注解叫倍,它的包是javax.annotation.Resource豌鸡,需要導(dǎo)入,但是Spring支持該注解的注入段标。

1涯冠、共同點

兩者都可以寫在字段和setter方法上。兩者如果都寫在字段上逼庞,那么就不需要再寫setter方法蛇更。

2、不同點

(1)@Autowired

@Autowired為Spring提供的注解,需要導(dǎo)入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入派任。

public class TestServiceImpl {
// 下面兩種@Autowired只要使用一種即可
@Autowired
private UserDao userDao; // 用于字段上
@Autowired
public void setUserDao(UserDao userDao) { // 用于屬性的方法上
this.userDao = userDao;
}
}

@Autowired注解是按照類型(byType)裝配依賴對象砸逊,默認(rèn)情況下它要求依賴對象必須存在,如果允許null值掌逛,可以設(shè)置它的required屬性為false师逸。如果我們想使用按照名稱(byName)來裝配,可以結(jié)合@Qualifier注解一起使用豆混。如下:

public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}

(2)@Resource

@Resource默認(rèn)按照ByName自動注入篓像,由J2EE提供,需要導(dǎo)入包javax.annotation.Resource皿伺。@Resource有兩個重要的屬性:name和type员辩,而Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型鸵鸥。所以奠滑,如果使用name屬性,則使用byName的自動注入策略妒穴,而使用type屬性時則使用byType自動注入策略宋税。如果既不制定name也不制定type屬性,這時將通過反射機(jī)制使用byName自動注入策略讼油。

public class TestServiceImpl {
// 下面兩種@Resource只要使用一種即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上

@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于屬性的setter方法上
    this.userDao = userDao;
}

}

注:最好是將@Resource放在setter方法上杰赛,因為這樣更符合面向?qū)ο蟮乃枷耄ㄟ^set汁讼、get去操作屬性淆攻,而不是直接去操作屬性阔墩。

@Resource裝配順序:

①如果同時指定了name和type嘿架,則從Spring上下文中找到唯一匹配的bean進(jìn)行裝配,找不到則拋出異常啸箫。

②如果指定了name耸彪,則從上下文中查找名稱(id)匹配的bean進(jìn)行裝配,找不到則拋出異常忘苛。

③如果指定了type蝉娜,則從上下文中找到類似匹配的唯一bean進(jìn)行裝配,找不到或是找到多個扎唾,都會拋出異常召川。

④如果既沒有指定name,又沒有指定type胸遇,則自動按照byName方式進(jìn)行裝配荧呐;如果沒有匹配,則回退為一個原始類型進(jìn)行匹配,如果匹配則自動裝配倍阐。

@Resource的作用相當(dāng)于@Autowired概疆,只不過@Autowired按照byType自動注入。

4峰搪、@ModelAttribute和 @SessionAttributes

代表的是:該Controller的所有方法在調(diào)用前岔冀,先執(zhí)行此@ModelAttribute方法,可用于注解和方法參數(shù)中概耻,可以把這個@ModelAttribute特性使套,應(yīng)用在BaseController當(dāng)中,所有的Controller繼承BaseController咐蚯,即可實現(xiàn)在調(diào)用Controller時童漩,先執(zhí)行@ModelAttribute方法。

@SessionAttributes即將值放到session作用域中春锋,寫在class上面矫膨。

具體示例參見下面:使用 @ModelAttribute 和 @SessionAttributes 傳遞和保存數(shù)據(jù)
SpringMVC 支持使用 @ModelAttribute 和 @SessionAttributes 在不同的模型(model)和控制器之間共享數(shù)據(jù)。 @ModelAttribute 主要有兩種使用方式期奔,一種是標(biāo)注在方法上侧馅,一種是標(biāo)注在 Controller 方法參數(shù)上。

當(dāng) @ModelAttribute 標(biāo)記在方法上的時候呐萌,該方法將在處理器方法執(zhí)行之前執(zhí)行馁痴,然后把返回的對象存放在 session 或模型屬性中,屬性名稱可以使用 @ModelAttribute(“attributeName”) 在標(biāo)記方法的時候指定肺孤,若未指定罗晕,則使用返回類型的類名稱(首字母小寫)作為屬性名稱。關(guān)于 @ModelAttribute 標(biāo)記在方法上時對應(yīng)的屬性是存放在 session 中還是存放在模型中赠堵,我們來做一個實驗小渊,看下面一段代碼。

5茫叭、@PathVariable

用于將請求URL中的模板變量映射到功能處理方法的參數(shù)上酬屉,即取出uri模板中的變量作為參數(shù)。如:

@Controller
public class TestController {
@RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)
public String getLogin(@PathVariable("userId") String userId,
@PathVariable("roleId") String roleId){
System.out.println("User Id : " + userId);
System.out.println("Role Id : " + roleId);
return "hello";
}
@RequestMapping(value="/product/{productId}",method = RequestMethod.GET)
public String getProduct(@PathVariable("productId") String productId){
System.out.println("Product Id : " + productId);
return "hello";
}
@RequestMapping(value="/javabeat/{regexp1:[a-z-]+}",
method = RequestMethod.GET)
public String getRegExp(@PathVariable("regexp1") String regexp1){
System.out.println("URI Part 1 : " + regexp1);
return "hello";
}
}

6揍愁、@requestParam

@requestParam主要用于在SpringMVC后臺控制層獲取參數(shù)呐萨,類似一種是request.getParameter("name"),它有三個常用參數(shù):defaultValue = "0", required = false, value = "isApp"莽囤;defaultValue 表示設(shè)置默認(rèn)值谬擦,required 銅過boolean設(shè)置是否是必須要傳入的參數(shù),value 值表示接受的傳入的參數(shù)類型朽缎。

7惨远、@ResponseBody

作用: 該注解用于將Controller的方法返回的對象蔚舀,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)锨络。

使用時機(jī):返回的數(shù)據(jù)不是html標(biāo)簽的頁面赌躺,而是其他某種格式的數(shù)據(jù)時(如json、xml等)使用羡儿;

8礼患、@Component

相當(dāng)于通用的注解,當(dāng)不知道一些類歸到哪個層時使用掠归,但是不建議缅叠。

9、@Repository

用于注解dao層虏冻,在daoImpl類上面注解肤粱。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市厨相,隨后出現(xiàn)的幾起案子领曼,更是在濱河造成了極大的恐慌,老刑警劉巖蛮穿,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庶骄,死亡現(xiàn)場離奇詭異,居然都是意外死亡践磅,警方通過查閱死者的電腦和手機(jī)单刁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來府适,“玉大人羔飞,你說我怎么就攤上這事¢艽海” “怎么了逻淌?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喇聊。 經(jīng)常有香客問我恍风,道長蹦狂,這世上最難降的妖魔是什么誓篱? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮凯楔,結(jié)果婚禮上窜骄,老公的妹妹穿的比我還像新娘。我一直安慰自己摆屯,他們只是感情好邻遏,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布糠亩。 她就那樣靜靜地躺著,像睡著了一般准验。 火紅的嫁衣襯著肌膚如雪赎线。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天糊饱,我揣著相機(jī)與錄音垂寥,去河邊找鬼。 笑死另锋,一個胖子當(dāng)著我的面吹牛滞项,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夭坪,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼文判,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了室梅?” 一聲冷哼從身側(cè)響起戏仓,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亡鼠,沒想到半個月后柜去,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡拆宛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年嗓奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浑厚。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡股耽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钳幅,到底是詐尸還是另有隱情物蝙,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布敢艰,位于F島的核電站诬乞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钠导。R本人自食惡果不足惜震嫉,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牡属。 院中可真熱鬧票堵,春花似錦、人聲如沸逮栅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至特纤,卻和暖如春军俊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捧存。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工蝇完, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矗蕊。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓短蜕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親傻咖。 傳聞我的和親對象是個殘疾皇子朋魔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容