首先要取得Spring的相關檔案,Spring的檔案放在 SourceForge。
撰寫此文時,Spring最新的版本是1.2.5,有兩個下載版本,一個是spring-framework-1.2.5-with- dependencies.zip,一個是spring-framework-1.2.5.zip,with-dependencies的包括一些 ant、jakarta-commons、struts、velocity等等其它開源Java專案的相依檔案,如果您也需要這些相關檔案,可以下載這個 版本,如果您已經有這些相關檔案,則只需要下載spring-framework-1.2.5.zip這個檔案。
下載zip檔案並解壓縮之後,在dist目錄下就是使用Spring所需要的相關檔案,如果下載的是with-dependencies版本,則在lib 目錄中的是您可能會用到的相依檔案。在dist目錄下,spring-core.jar是Spring的核心,如果日後需要使用到Spring其它的子框 架支援,再將其它的jar檔案加入即可,例如spring-aop.jar、spring-webmvc.jar等等。您也可以直接使用 spring.jar這個檔案,它包括了所有Spring支援的功能所需要的所有類別,而不再需要加入個別的jar檔案。
注意在Spring 1.2之後,原先於spring-core.jar中與Bean相關的一些套件,現在已移至spring-beans.jar中。
就這邊接下來要練習的第一個Spring程式,要將spring-core.jar、spring-beans.jar,以及相依的commons- logging.jar加至Classpath的路徑中,您可以在lib目錄的jakarta-commons目錄中找到。
來撰寫您的第一個組件(Component),它只是一個簡單的JavaBean,用來向使用者打聲招呼:
- HelloBean.java
package onlyfun.caterpillar;
public class HelloBean {
private String helloWord;
public void setHelloWord(String helloWord) {
this.helloWord = helloWord;
}
public String getHelloWord() {
return helloWord;
}
}
稍後您可以透過setHelloWord()這個Setter來設定新的招呼語,不過並不是親自撰寫程式來作這些事,而是在組態檔案定義,由Spring 來為您作設定的動作,接著可以撰寫Bean的定義檔案,定義檔案會告訴Spring容器,如何完成相依物件的關係注入等動作,Bean定義檔的名稱可以自 由定義,例如這邊取名為beans-config.xml:
- beans-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloBean"
class="onlyfun.caterpillar.HelloBean">
<property name="helloWord">
<value>Hello!Justin!</value>
</property>
</bean>
</beans>
定義檔中定義了JavaBean的別名與來源類別,<property>標籤中設定了希望注入至JavaBean的字串值,撰寫一個簡單的示範程式:
- SpringDemo.java
package onlyfun.caterpillar;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
public class SpringDemo {
public static void main(String[] args) {
Resource rs =
new FileSystemResource("beans-config.xml");
BeanFactory factory =
new XmlBeanFactory(rs);
HelloBean hello =
(HelloBean) factory.getBean("helloBean");
System.out.println(hello.getHelloWord());
}
}
BeanFactory是 Factory 模式 的一個實作例子,但用途更為一般,可以建立、管理不同型態的物件,由於這邊所使用的Bean定義檔是XML,所以使用實作BeanFactory介面的 XmlBeanFactory來作為管理Bean的實際物件,在Spring 1.2中,XmlBeanFactory只接受實作Resource介面的物件,像是ClassPathResource、 FileSystemResource、InputStreamResource、ServletContextResource、 UrlResource等,分別表示不同的檔案來源物件,這邊所使用的是FileSystemResource,表示指定相對路徑或絕對路徑來取得 Bean定義檔, 同樣的,如果您的Bean定義檔是位於Classpath路徑中,您也可以使用ClasspPathResource來取得定義檔。
這是從比較低層次的角度來使用Spring的IoC容器功能,藉由BeanFactory來讀取組態檔案並完成依賴的關聯注入,這邊的依賴是什麼?指的是 HelloBean相依於String物件,透過Setter所保留的介面,使用Setter injection來完成這個依賴注入,而不是將招呼語寫死在HelloBean,BeanFactory是整個Spring的重點所在,整個 Spring的核心都圍繞著它,在這邊使用的是XmlBeanFactory,負責讀取XML組態檔案,您也可以使用properties檔案,這之後會 再介紹。
BeanFactory讀取Bean的組態設定並完成關係維護之後,可以藉由getBean()方法並指定Bean的別名來取得Bean實例,如果使用 BeanFactory的話,只有在真正需要Bean物件時,才會實際建立Bean實例,而不是在一開始建立BeanFactory時就建立Bean實 例,來看看實際運行之後的效果 :
2005/10/16 下午 07:14:03 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
資訊: Loading XML bean definitions from file [C:\workspace\SpringDemo\beans-config.xml]
Hello!Justin!
資訊: Loading XML bean definitions from file [C:\workspace\SpringDemo\beans-config.xml]
Hello!Justin!
如果今天您要想改變招呼語,則只要更改beans-config.xml就可以了,不用修改主要的程式,從比較一般的角度來看,就意味著如果您想要改變一些物件之間的依賴關係,則只要修改組態檔即可,而不用修改組件的任何一行程式。