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