Spring當中有哪些註解可以使用?


轉自:

http://blog.csdn.net/xyh820/article/details/7303330/

概述

注釋配置相對於 XML 配置具有很多的優勢:

  • 它可以充分利用 Java 的反射機制獲取類結構信息,這些信息可以有效減少配置的工作。如使用 JPA 注釋配置 ORM 映射時,我們就不需要指定 PO 的屬性名、類型等信息,如果關係表欄位和 PO 屬性名、類型都一致,您甚至無需編寫任務屬性映射信息——因為這些信息都可以通過 Java 反射機制獲取。
  • 注釋和 Java 代碼位於一個文件中,而 XML 配置採用獨立的配置文件,大多數配置信息在程序開發完成後都不會調整,如果配置信息和 Java 代碼放在一起,有助於增強程序的內聚性。而採用獨立的 XML 配置文件,程序員在編寫一個功能時,往往需要在程序文件和配置文件中不停切換,這種思維上的不連貫會降低開發效率。

因此在很多情況下,注釋配置比 XML 配置更受歡迎,注釋配置有進一步流行的趨勢。Spring 2.5 的一大增強就是引入了很多注釋類,現在您已經可以使用注釋配置完成大部分 XML 配置的功能。在這篇文章里,我們將向您講述使用注釋進行 Bean 定義和依賴注入的內容。

--------------------------------------------------------------------------------------------------------------------

原來我們是怎麼做的

在使用注釋配置之前,先來回顧一下傳統上是如何配置 Bean 並完成 Bean 之間依賴關係的建立。下面是 3 個類,它們分別是 Office、Car 和 Boss,這 3 個類需要在 Spring 容器中配置為 Bean:

Office 僅有一個屬性:

清單 1. Office.java

package com.baobaotao;
public class Office {
private String officeNo =」001」;

//省略 get/setter

@Override
public String toString() {
return "officeNo:" + officeNo;
}
}

Car 擁有兩個屬性:

清單 2. Car.java

package com.baobaotao;

public class Car {
private String brand;
private double price;

// 省略 get/setter

@Override
public String toString() {
return "brand:" + brand + "," + "price:" + price;
}
}

Boss 擁有 Office 和 Car 類型的兩個屬性:

清單 3. Boss.java

package com.baobaotao;

public class Boss {
private Car car;
private Office office;

// 省略 get/setter

@Override
public String toString() {
return "car:" + car + "
" + "office:" + office;
}
}

我們在 Spring 容器中將 Office 和 Car 聲明為 Bean,並注入到 Boss Bean 中:下面是使用傳統 XML 完成這個工作的配置文件 beans.xml:

清單 4. beans.xml 將以上三個類配置成 Bean


&
&
&
&


&


&
&
&


&
&
&


&


&
&

當我們運行以下代碼時,控制台將正確打出 boss 的信息:

清單 5. 測試類:AnnoIoCTest.java


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AnnoIoCTest {

public static void main(String[] args) {
String[] locations = {"beans.xml"};
ApplicationContext ctx =
new ClassPathXmlApplicationContext(locations);
Boss boss = (Boss) ctx.getBean("boss");
System.out.println(boss);
}
}

-------------------------------

這說明 Spring 容器已經正確完成了 Bean 創建和裝配的工作。

使用 @Autowired 注釋

Spring 2.5 引入了 @Autowired 注釋,它可以對類成員變數、方法及構造函數進行標註,完成自動裝配的工作。來看一下使用@Autowired 進行成員變數自動注入的代碼:

清單 6. 使用 @Autowired 注釋的 Boss.java

package com.baobaotao;
import org.springframework.beans.factory.annotation.Autowired;

public class Boss {

@Autowired
private Car car;

@Autowired
private Office office;


}

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

清單 7. 讓 @Autowired 注釋工作起來

&
&

&
&

&
&

&
&


&
&
&


&


&
&

這樣,當 Spring 容器啟動時,AutowiredAnnotationBeanPostProcessor 將掃描 Spring 容器中所有 Bean,當發現 Bean 中擁有@Autowired 注釋時就找到和其匹配(默認按類型匹配)的 Bean,並注入到對應的地方中去。

按照上面的配置,Spring 將直接採用 Java 反射機制對 Boss 中的 car 和 office 這兩個私有成員變數進行自動注入。所以對成員變數使用@Autowired 後,您大可將它們的 setter 方法(setCar() 和 setOffice())從 Boss 中刪除。

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

清單 8. 將 @Autowired 注釋標註在 Setter 方法上

package com.baobaotao;

public class Boss {
private Car car;
private Office office;

@Autowired
public void setCar(Car car) {
this.car = car;
}

@Autowired
public void setOffice(Office office) {
this.office = office;
}

}

這時,@Autowired 將查找被標註的方法的入參類型的 Bean,並調用方法自動注入這些 Bean。而下面的使用方法則對構造函數進行標註:

清單 9. 將 @Autowired 注釋標註在構造函數上

package com.baobaotao;

public class Boss {
private Car car;
private Office office;

@Autowired
public Boss(Car car ,Office office){
this.car = car;
this.office = office ;
}


}

由於 Boss() 構造函數有兩個入參,分別是 car 和 office,@Autowired 將分別尋找和它們類型匹配的 Bean,將它們作為Boss(Car car ,Office office)的入參來創建 Boss Bean。

當候選 Bean 數目不為 1 時的應對方法

在默認情況下使用 @Autowired 注釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將拋出BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。我們可以來做一個實驗:

清單 10. 候選 Bean 數目為 0 時


&
&

&

&

&
&
&


&--&>

&
&


&


&
&

由於 office Bean 被注釋掉了,所以 Spring 容器中將沒有類型為 Office 的 Bean 了,而 Boss 的office 屬性標註了 @Autowired,當啟動 Spring 容器時,異常就產生了。

當不能確定 Spring 容器中一定擁有某個類的 Bean 時,可以在需要自動注入該類 Bean 的地方可以使用 @Autowired(required = false),這等於告訴 Spring:在找不到匹配 Bean 時也不報錯。來看一下具體的例子:

清單 11. 使用 @Autowired(required = false)

package com.baobaotao;

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

public class Boss {

private Car car;
private Office office;

@Autowired
public void setCar(Car car) {
this.car = car;
}
@Autowired(required = false)
public void setOffice(Office office) {
this.office = office;
}

}

清單 12. 在 beans.xml 中配置兩個 Office 類型的 Bean



&
&


&
&
&


&

---------------------待續


推薦閱讀:

Spring MVC攔截器的使用
webservice,註解mybatis問題?
@Autowired和@Resource的區別是什麼?
測試Spring MVC應用

TAG:Spring | SpringMVC框架 |