首先要取得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!
如果今天您要想改变招呼语,则只要更改beans-config.xml就可以了,不用修改主要的程序,从比较一般的角度来看,就意味着如果您想要改变一些对象之间的依赖关系,则只要修改组态档即可,而不用修改组件的任何一行程序。