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
這樣 根本不需要改到任何一行程式
也算是符合 所謂的 "開閉原則"
對新增開放 對修改關閉
沒有留言:
張貼留言