天天看點

Spring注解_詳解Spring注解_詳解

Spring注解_詳解

@Autowired 注釋

将 @Autowired 注釋标注在成員變量上 

import org.springframework.beans.factory.annotation.Autowired;

public class Boss {

@Autowired

private Car car;

private Office office;

}

 它可以對類成員變量、方法及構造函數進行标注,完成自動裝配的工作。

Spring 通過一個 BeanPostProcessor 對 @Autowired 進行解析,是以要讓 @Autowired 起作用必須事先在 Spring 容器中聲明AutowiredAnnotationBeanPostProcessor Bean。

<!-- 該 BeanPostProcessor 将自動起作用,對标注 @Autowired 的 Bean 進行自動注入 -->

 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

這樣,當 Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 将掃描 Spring 容器中所有 Bean,當發現 Bean 中擁有 @Autowired 注釋時就找到和其比對(預設按類型比對)的 Bean,并注入到對應的地方中去。

按照上面的配置,Spring 将直接采用 Java 反射機制對 Boss 中的 car 和 office 這兩個私有成員變量進行自動注入。

是以對成員變量使用 @Autowired 後,大可将它們的 setter 方法(setCar() 和 setOffice())從 Boss 中删除。

當然,也可以通過 @Autowired 對方法或構造函數進行标注,來看下面的代碼:

将 @Autowired 注釋标注在 Setter 方法上

@Autowired

public void setCar(Car car) {

this.car = car;

}

public void setOffice(Office office) {

this.office = office;

這時,@Autowired 将查找被标注的方法的入參類型的 Bean,并調用方法自動注入這些 Bean。

将 @Autowired 注釋标注在構造函數上

public Boss(Car car ,Office office){

this.office = office ;

由于 Boss() 構造函數有兩個入參,分别是 car 和 office,@Autowired 将分别尋找和它們類型比對的 Bean,将它們作為 Boss(Car car ,Office office) 的入參來建立 Boss Bean。

@Qualifier

當我們在 Spring 容器中配置了兩個類型為 Office 類型的 Bean,當對 Boss 的 office 成員變量進行自動注入時,Spring 容器将無法确定到底要用哪一個 Bean,就會發生異常。

Spring 允許我們通過 @Qualifier 注釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:

@Autowired

public void setOffice(@Qualifier("office")Office office) {

this.office = office;

@Qualifier("office") 中的 office 是 Bean 的名稱,是以 @Autowired 和 @Qualifier 結合使用時,自動注入的政策就從 byType 轉變成 byName 了。

@Autowired 可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的标注對象是成員變量、方法入參、構造函數入參。正是由于注釋對象的不同,是以 Spring 不将 @Autowired 和 @Qualifier 統一成一個注釋類。

對成員變量使用 @Qualifier 注釋

private Car car;

@Qualifier("office")

對構造函數變量使用 @Qualifier 注釋 @Qualifier 隻能和 @Autowired 結合使用,是對 @Autowired 有益的補充。一般來講,@Qualifier 對方法簽名中入參進行注釋會降低代碼的可讀性,而對成員變量注釋則相對好一些。

public Boss(Car car , @Qualifier("office")Office office){

 @Controller

@Controller的基本目标是擔任所注解的類的原型的角色,指明它的職責。Dispatcher将會在這樣被注解的類中掃描映射的方法,探測注解@RequestMapping。

所注解的控制器bean可以被顯式定義,這個過程是在Dispatcher的上下文中使用标準的Spring bean定義完成的。然而,@Controller原型也允許自動探測,要實作對所注解的控制器的自動探測,必須要向配置中加入元件掃描的部分。實作如下:

<beans xsi:schemaLocation="

  http://www.springframework.org/schema/mvc

http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd">

@RequestMapping 

@RequestMapping是一種通過比對URL路徑來通路相應頁面的

分類:類級别的和方法級别的

@RequestMapping的幾種形式:

@RequestMapping(method = RequestMethod.GET)

@RequestMapping(value="/{day}", method = RequestMethod.GET)//day為方法中的參數

@RequestMapping(value="/new", method = RequestMethod.GET)

将@RequestMapping放在類級别上這可令它與方法級别上的@RequestMapping注解協同工作,取得縮小選擇範圍的效果,如下:

@RequestMapping("/a")//類級别,可以不需要,如果要了,下面所有的請求路徑前都需要加入 /a

public class ccccontroller{

@RequestMapping("/b")//方法級别,必須有,決定這個方法處理哪個請求,如果有類級别 /a/b

    @RequestMapping(value="/b" method=RequestMethod.POST)

    @RequestMapping(value="/b", method=RequestMethod.GET, params="type=checking")

    @RequestMapping

public String show()

{

//如果沒有類級别的就直接請求/b

return;

}

第一個是一種簡寫方式,比對路徑為 “/a/b”;

第二個方法級的請求映射和類級别的映射結合,當HTTP方法是POST時與路徑“/a/b”比對;

第三個添加了一個要求,就是名為“type”的請求參數和其值“checking”都需要在請求中出現;

第四個根本就沒有指定路徑,這個方法比對所有的 HTTP方法,如果有必要的話可以用它的方法名。下面改寫我們的方法,使它可以依靠方法名進行比對。

分類: 

spring