Spring框架采用模块化设计,包含的很多功能特性被很好组织在六个模块当中:Core、Aop、Dao、ORM、JEE、Web,其中Core提供了IOC和依赖注入特性,是Spring的基础,贯穿于spring框架应用的始终。Spring框架可以很好的与许多别的框架如structs、hibernate集成起来一起构建企业应用程序。
1. 简介
在Spring开发包中,org.springframework.beans和org.springframework.context是IOC的基础包,Beanfactory和ApplicationContext是两个基础接口,Beanfactory接口用于配置bean,ApplicationContext接口是Beanfactory接口的扩展,它还可以进行配置Aop和事务处理。简言之,IOC就是利用配置文件提供应用程序所需的对象或组件,而不是去直接创建对象的模式,容器就是将一系列联系起来。
2. 配置元数据
在Spring中,那些组成你应用程序的实体及由Spring IOC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。而bean定义以及bean相互间的依赖将通过配置元数据来描述。
通常情况下,Spring是采用简单直观的XML来作为配置元数据的描述格式,然而,它不是唯一的描述方式。在XML配置元数据中我们可以对那些我们希望通过 Spring IoC容器管理的bean进行定义。
BeanFactory接口是Spring IOC的核心接口,它的职责就是实例化、定位和管理bean及建立bean之间的依赖。Spring IOC容器通过一些BeanFactory实现类来获取XML配置元数据,并以此来构建应用程序,其中XmlBeanFactory就是其中最常用的一个。
在大多数的应用程序中,并不需要用显式的代码去实例化一个或多个的Spring IoC 容器实例。例如,在web应用程序中,我们只需要在web.xml中添加 (大约)8 行简单的XML描述符即可,ApplicationContext
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoade rListener</listener-class>
</listener>
<!-- or use the ContextLoaderServlet instead of the above listener
<servlet>
<servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
-->
Spring IOC容器至少包含一个bean定义,但大多数情况下会有多个bean定义。当使用 基于XML的配置元数据时,将在顶层的<beans/>元素中配置一个或多个<bean/>元素。
bean定义与应用程序中实际使用的对象一一对应。通常情况下bean的定义包括:服务层对象、数据访问层对象(DAO)、类似Struts Action的表示层对象、Hibernate SessionFactory对象等等。通常bean的定义并不与容器中的领域对象相同,因为领域对象的创建和加载必须依赖具体的DAO和业务逻辑。
以下是一个基于XML的配置元数据的基本结构:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="..." class="...">
<!--collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
Spring IoC容器的实例化非常简单,如下面的例子:
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"services.xml", "daos.xml"});
// an ApplicationContext is also a BeanFactory (via inheritance)
BeanFactory factory = context;
有时候,将XML配置文件分拆成多个部分是非常有用的。为了加载多个XML文件生成一个 ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext构造器 。而bean factory将通过调用bean defintion reader从多个文件中读取bean定义。
通常情况下,倾向于上述做法,因为这样各个配置并不会查觉到它们 与其他配置文件的组合。另外一种方法是使用一个或多个的<import/>元素 来从另外一个或多个文件加载bean定义。所有的<import/>元素必 须在<bean/>元素之前完成bean定义的导入。 让我们看个例子:
<beans>
<import resource="services.xml"/>
<import resource="resources/messageSource.xml"/>
<import resource="/resources/themeSource.xml"/>
<bean id="bean1" class="..."/>
<bean id="bean2" class="..."/>
</beans>
在上面的例子中,我们从3个外部文件:services.xml、messageSource.xml及themeSource.xml 来加载bean定义。这里采用的都是相对路径,因此,此例中的services.xml 一定要与导入文件放在同一目录或类路径,而messageSource.xm l和themeSource.xml的文件位置必须放在导入文件所 在目录下的resources目录中。正如你所看到的那样,开头的斜杠‘/’实际上可忽略。因此不用斜杠‘/’可能会更好一点。根据Spring XML配置文件的 Schema(或DTD),被导入文件必须是完全有效的XML bean定义文件,且根节点必须为 <beans/> 元素。