介绍Spring容器
声明bean
通过构造器和set函数注入
捆绑bean
控制bean的创建和删除
Spring中,对象不需要寻找或者创建需要协作的对象的实例,代替的是,通过容器来进行注入。例如,一个订单管理组件是基本的DI,经常被认为是wiring(捆绑,我认为)。这章,我们学习使用Spring捆绑bean的基础。有很多技术可以使用。
2.1容纳你的bean
在Spring程序中,对象生存在容器中。图2.1所示,对象由容器生成,捆绑在一起,进行配置,管理生存期。
图2.2中,可以看到如何配置Spring来知道,哪个对象来创建,配置和捆绑在一起。第一步,要了解对象存放的容器。理解容器对如何管理程序有好处。
容器是Spring框架的核心。Spring实现的容器有几种,分为2个类型。Bean factories(com.springframework.beans.factory.BeanFactory接口定义的)是最简单的容器,提供DI最基本的支持。Application context(com.springframework.context.ApplicationContext)是在bean factory基础上实现的,提供了系统框架的功能,比如,从一个properties文件中读取文本信息的能力等。
NOTE:这里的bean指的是POJO(plain-old java object),不是web中的概念。
下面看最基本的容器,BeanFactory
2.1.1 介绍BeanFactory
跟名字的意思一样,一个bean factory是由factory模式生成的。就是说,一个负责创建和分配beans的类。尽管跟其他一些实现工厂模式的实现不同,它经常生成单例的对象,一个bean factory是为了生成的工厂,创建和销毁很多类型的beans。
一个bean factory除了简单生成对象和分配对象还有很多功能。因为bean factory知道应用程序内的很多对象,它能够在初始化是创建对象间的关系。它就把配置从bean的本身和bean的客户端处分离出来。结果是,bean factory交出对象,这些对象已经配置好了,知道了合作的对象,并且立即可以使用了。还有,bean factory还参与bean的生命周期,启动一些自定义的初始化和销毁。
BeanFactory有很多实现,在Spring用得最多的是org.springframework.bean.factory.xml.XmlBeanFactory,它能从xml配置文件中装载beans。
为了创建一个XmlBeanFactory,你必须要想构造器传递一个org.springframework.core.io.Resource的实例。Resource对象向构造器提供xml文件。Spring提供了少数的Resource的实现,2.1表
例如,下面的片段通过FileSystemResource读取xml文件来创建XmlBeanFactory。
BeanFactory factory = new XmlBeanFactory(new FileSystemResource(“beans.xml”));
这行代码告诉bean factory从beans.xml文件中读取bean的定义。Beans就被动的加入到bean factory中了,意思是,bean factory会立即读取bean的定义(包括bean的描述和属性),bean的初始化是在当它们被需要的时候。
从bean factory中的到一个bean,,只需要调用getBean方法即可,参数是bean的id
MyBean bean = factory.getBean(“myBean”);
调用getBean的时候,factory会实例化bean,并且通过DI把属性赋值进去。因此,一个bean在Spring容器中的生命开始了。在 2.1.3 节中检查一个bean的声明周期。但先看另一个容器,application context。
2.1.2 用application context编程
简单的程序使用bean factory就可以了,但为了使用Spring提供的更多功能,可以使用更好的容器实现,application context。
表面上,ApplicationContext跟BeanFactory一样,都是载入bean定义,捆绑它们,销毁。但ApplicationContext提供下面的
l ApplicationContext提供了对i18n的支持
l ApplicationContext提供了一般的属性资源的读取,比如图片
l ApplicationContext给事件提供了监听器支持
因为这些额外的功能,ApplicationContext比BeanFactory使用的更加广泛。只有在资源不足的时候再使用BeanFactory,比如手机设备。以后这本书都使用ApplicationContext。
ApplicationContext有3个使用方式
l ClassPathXmlApplicationContext-通过classpath来读取xml文件,把xml文件当作类资源
l FileSystemXmlApplicationContext在文件系统里读取xml文件
l XmlWebApplicationContext在web路径找xml文件
13章讲述XmlWebApplicationContext,那章介绍基于web的Spring项目。现在只考虑用前两个。
第一个的用法:
ApplicationContext context = new FileSystemXmlApplicationContext(“c:/foo.xml”);
第二个很相似:
ClassPathXmlApplicationContext context = new ClasspathXmlApplicationContext(“foo.xml”);
不同点在于,第一个在指定路径中寻找xml文件,第二个在所有类路径中,包括jar中寻找xml文件。
这两个方法中,得到bean同bean factory的方法一样,用getBean的方法。因为ApplicationContext接口继承与BeanFactory接口。
不管ApplicationContext提供的额外功能,另外一个很大的区别是一个单例bean的载入方式不同。Bean factory在genBean方法调用时载入,ApplicationContext有些智能,它在初始化就读入所有的单例Bean。这样,你可以保证在用到这些单例bean的时候就用,不用等待了。
上面是spring容器基础,下面看bean的生命周期。
2.1.3 bean的生命周期
传统java程序中很简单。用new来创建,不需要时候通过自动垃圾收集销毁。相反,spring容器中的生命周期就比较详细了。因为这样,你可以使用spring在创建bean时提供的一些好处。
图2.2示例了一个bean通过BeanFactory生成的过程。表2.2解释了每步的含义。
在ApplicationContext中的bean只跟BeanFactory中的有一点不同,下面是图:
唯一不同的是bean继承ApplicationContextAware接口,创建时会调用setApplicationContext方法会调用。
现在你知道如何创建和载入一个spring容器了,为了得到spring DI的一些有益之处,那么你必须把对象捆绑到spring容器上。下面看如何用xml来在spring中配置bean