Bean、消息、事件
Spring的核心是一个容器(Container),它实现了IoC的概念,可以协助管理各个对象的生命周期,以及对象之间的依赖关系。在核心容器的使用,熟悉BeanFactory与ApplicationContext的运用是了解Spring的重点所在。
1 Bean基本管理
1.1 BeanFactory、ApplicationContext
BeanFactory负责读取Bean定义文件;管理对象的加载、生成;维护Bean对象与Bean对象之间的依赖关系;负责Bean的生命周期。对于简单的应用程序来说,使用BeanFactory就已经足够来管理Bean了,在对象的管理上已可以获得许多的方便性,BeanFactory接口包括了6种方法可以调用。
boolean containsBean(String)
测试BeanFactory中是否包含指定名称的Bean。
Object getBean(String)
指定Bean定义文件中设置的名称,可取得相对应的Bean实例。
Object getBean(String,class)
指定Bean定义文件中设置的名称,取得相对应的Bean实例,并转换(Cast)至指定的类。
Class getType(String name)
指定Bean定义文件中设置的名称,取得对应的Bean的class实例
boolean isSingletom(String)
指定Bean定义文件中设置的名称,测试指定的Bean之scope是否为Singleton(之后在Bean的scope中会说明)。
String[] getAliases(String)
指定Bean定义文件中设置的名称,取得该Bean所有的别名(之后在Bean的识别名称与别名中会说明)。
不过作为一个应用程序框架,只提供Bean容器管理的功能是不够的,若要利用Spring所提供的一些特色以及高级的容器功能,可以使用org.springframework.context.ApplicationContext.ApplicatonContext是基于BeanFactory而建立的,也具备读取Bean定义文件,维护Bean之间的依赖关系等功能,除此之外,ApplicationContext还提供一个应用程序所需的更完整的框架功能,例如:
提供更方便地取得资料文件(Resources file)的方法。
提供解析文字消息的方法。
支持国际化消息
ApplicationContext可以发布事件,对事件感兴趣的Bean可以接收到这些事件。
Spring的创始者Rod Johnson建议使用ApplicationContext来取代BeanFactory,在实现ApplicationContext的类中,最常使用的大概是以下3个。
org.springframework.context.support.fileSystemXmlApplicationContext
可指定XML定义文件的相对路径或绝对路径读取定义文件。
org.springframework.context.support.ClassPathXMlApplicationContext
从Classpath设置路径中读取XML定义文件
org.springframework.web.context.support.XmlWebApplication
在Web应用程序的文件架构中,指定相对位置读取定义文件。
在Spring中整合Hibernate
Spring整合了对Hibernate的设置,并提供了org.springframework.orm.hibernate3.HibernateTemplate等类,让您在结合Hibernate使用时可以简化程序编写的流程,并且与JDBC相类似的使用模型提供使用Hibernate时的编程事务管理与声明事务管理
SessionFactory注入
Spring可以与Hibernate结合使用,Hibernate的连结、事务管理等是由建立SessionFactory开始的,SessionFactory在应用程序中通常只需存在一个实例,因而SessionFactory底层的DataSource可以使用Spring的Ioc注入,之后再把SessionFactory注入至相依赖的对象之中。
例如可以修改前面的项目,首先可删除hibernate.cfg.xml,因为这部分可以由Spring在Bean定义文件中编写DataSource设置以及依赖注入来取代,可以如下编写Spring的Bean定义文件:
bean-config.xml
....
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/demo"/>
<property name="username" value="caterpillar"/>
<property name="password" value="123456"/>
</bean>
...........
HibernateTemplate
Spring的Template-callback机制在Hibernate的实现提供了org.springframework.orm.hibernate3.HibernateTemplate类与org.springframework.orm.hibernate3.HibernateCallback接口。