在應用中,我們常常使用<ref>标簽為JavaBean注入它依賴的對象。但是對于一個大型的系統,這個操作将會耗費我們大量的資源,我們不得不花費大量的時間和精力用于建立和維護系統中的<ref>标簽。實際上,這種方式也會在另一種形式上增加了應用程式的複雜性,那麼如何解決這個問題呢?Spring為我們提供了一個自動裝配的機制,盡管這種機制不是很完善,但是在應用中結合<ref>标簽還是可以大大的減少我們的勞動強度。前面提到過,在定義Bean時,<bean>标簽有一個autowire屬性,我們可以通過指定它來讓容器為受管JavaBean自動注入依賴對象。
<bean>的autowire屬性有如下六個取值,他們的說明如下:
1、 No:即不啟用自動裝配。Autowire預設的值。
2、 byName:通過屬性的名字的方式查找JavaBean依賴的對象并為其注入。比如說類Computer有個屬性printer,指定其autowire屬性為byName後,Spring IoC容器會在配置檔案中查找id/name屬性為printer的bean,然後使用Seter方法為其注入。
3、 byType:通過屬性的類型查找JavaBean依賴的對象并為其注入。比如類Computer有個屬性printer,類型為Printer,那麼,指定其autowire屬性為byType後,Spring IoC容器會查找Class屬性為Printer的bean,使用Seter方法為其注入。
4、 constructor:通byType一樣,也是通過類型查找依賴對象。與byType的差別在于它不是使用Seter方法注入,而是使用構造子注入。
5、 autodetect:在byType和constructor之間自動的選擇注入方式。
6、 default:由上級标簽<beans>的default-autowire屬性确定。
注意:在配置bean時,<bean>标簽中Autowire屬性的優先級比其上級标簽高,即是說,如果在上級标簽中定義default-autowire屬性為byName,而在<bean>中定義為byType時,Spring IoC容器會優先使用<bean>标簽的配置。
下面通過一個例子來說明如何在應用中使用自動裝配(工程代碼見例程3.2)。建立一個java工程,為其添加上Spring開發能力後,建立一個ioc.test包,再分别建立電腦類(Computer)、主機類(Host)和顯示器類(Dispaly),為電腦類添加Host類型的屬性host和Display類型的屬性display,再添加一個run方法,讓電腦可以“運作”一起來。屬性代碼如下:
電腦類:
1
package ioc.test;
2
3
/**
4
* @author zhangyong
5
*/
6
public class Computer {
7
8
private Host host;
9
private Display display;
10
//電腦運作方法
11
public void run(){
12
System.out.println("你好,我是電腦,正在運作!");
13
System.out.print(" "+host.run()+",");
14
System.out.println(display.run());
15
}
16
//Geter和Seter方法,省略
17
}
18
再給主機類添加一run方法,讓主機也可以“運作”,代碼如下:
1
2
3
public class Host {
4
public String run(){
5
return "我是主機,正在運作!";
6
7
8
同上也給Display類添加run方法,如下:
public class Display {
return "我是顯示器,正在運作!";
下面便是修改Spring的配置檔案,讓IoC容器為我們的“電腦”自動裝配“主機”和“顯示器了”。分别配置兩個bean,host和display。再配置一個名computer1的bean,autowire屬性設為byName,同理配置computer1和computer3,autowire屬性分别設為byType和default,最後設定<beans>标簽的default-autowire屬性為autodetect。至此,配置工作已經完成,可以看到,我們并沒有顯式的給computer bean它注入依賴對象host和display。配置代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-autowire="autodetect">
<bean id="computer1" class="ioc.test.Computer" autowire="byName"></bean>
<bean id="computer2" class="ioc.test.Computer" autowire="byType"></bean>
<bean id="computer3" class="ioc.test.Computer" autowire="default"></bean>
<bean id="host" class="ioc.test.Host"></bean>
<bean id="display" class="ioc.test.Display"></bean>
</beans>
現在可以建立一個測試類來測試一下Spring時候真的為我們自動裝配好了我們需要的bean。代碼如下:
//import省略
public class TestMain {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"applicationContext.xml");
//byName
Computer computer1 = (Computer)ac.getBean("computer1");
System.out.println("autowire=\"byName\":");
computer1.run();
//byType
Computer computer2 = (Computer)ac.getBean("computer2");
System.out.println("autowire=\"byType\":");
computer2.run();
19
//default
20
Computer computer3 = (Computer)ac.getBean("computer3");
21
System.out.println("autowire=\"default\":");
22
computer3.run();
23
24
25