2011年9月17日 星期六

Spring 教學 - Bean 的基本裝配

針對前一篇 所述的 IoC

Spring IoC 設計的核心即是 Bean 容器

前一篇內容說到  我們會把所以實現 Car 介面的實作類別交由 Spring 管理


並由 Spring 來將不同種類的車子(BMW or Benz)注入給 Driver 這個類別

再來注入有兩種主要方法

1. Setter Injection   2. Constructor Injection

首先先來看看 第一種注入方法  程式如前一篇所示了  這邊不在多述

只提醒一點就是 要使用 Setter Injection 時,以此為例就需要再 Driver 類別內

替 car 這個 attribute 設定 getter/setter

直接看看 Bean 的配置檔如何進行

<bean id="bmw" class="org.BMW">
</bean>

<bean id="benz" class="org.Benz">
</bean>

<bean id="driver" class="org.Driver">
    <property name="car">
        <ref local="benz"/>
    </property>
</bean>

以上我們將 BMW 和 Benz 這兩個實做 Car 介面的類別設定成兩個 Bean:bmw & benz 

交由 Spring 容器進行管理  並且再替Driver 類別定義一個Bean

並且透過 property 標籤將 Driver 的 car 屬性注入 Benz 這個實做類 的 Bean:benz

最後我們再來看看要怎執行程式

//...
/*** 以下範例我將 Bean 定義檔 Spring-modelBean.xml  放在 classpath 的 org 目錄下 ***/
Resource resource = new ClassPathResource("org/Spring-modelBean.xml");  //Bean 定義檔的位置
XmlBeanFactory factory = new XmlBeanFactory(resource);
Driver driver = (Driver)factory.getBean("driver");
driver.drive();
//...

在 Setter Injection 的 Bean 定義檔中 的 property 標籤 可以簡化成
<property name="car" ref="benz" >

最後如果要用第二種建構子注入

則須修改一下 Driver  讓他能接受 Car 型態的實作類別


public class Driver 
{
	private Car car;
	
	public Driver(Car car){
		this.car = car;
	}
        public void drive(){
		car.startRunning();
	}
}
並且將 Bean 的配置檔 更改為如下即可
<constructor-arg ref="benz"> </constructor-arg>

所以以上說了這麼多  如果今天我們要讓 Driver 換開 BMW

那我只要更改 Bean 的配置檔就好了

如果今天多了一種車 而要給 Driver 類別開  那你就必須

1. 新增某種車 (Lexus) 並實作 Car 介面

2. 在Bean的配置檔再多定義一個 Bean

3. 將這個 bean 注入給 Driver

這樣 根本不需要改到任何一行程式

也算是符合 所謂的 "開閉原則"

對新增開放 對修改關閉


沒有留言:

張貼留言