返回介绍

创建应用程序上下文对象

发布于 2025-04-21 21:42:16 字数 6693 浏览 0 评论 0 收藏

前面介绍 Spring 时,我们讨论了它如何负责创建和连接应用程序中的组件。为了让 Spring 组装各组件,我们需要告诉它系统中有什么组件(Spring 将它们称为 bean)以及它们之间是如何连接在一起的。我们使用一个 XML 文档来描述每个 bean 的类,为每个 bean 分配一个 ID,建立起各个 bean 之间的关联关系。为什么要用 ID?在 Spring 中,ID 就是每个 bean 的惟一的逻辑名称,在表达 bean 之间的关系,以及在运行时请求 bean 时,就会用到 bean 的 ID 属性。在我们的示例 Spring 配置文件中,就使用了诸如 artistDao 和 albumDao 之类的逻辑名称,每个 ID 引用了在配置文件中定义的一个组件。

Spring 再用这个 XML 文档来创建一个 ApplicationContext 对象,利用这个对象我们就可以按名称取回相应的组件。图 13-2 是我们这个程序 ApplicationContext 的内容结构图表。

图 13-2 我们的 Spring 应用程序上下文

从图 13-2 中可以看到,我们的 3 个测试组件与 3 个 DAO 对象连接在一起,每个 DAO 对象都有一个会话工厂对象引用,它负责创建一个 Hibernate 会话对象和连接到数据库。这个应用程序的 Spring 配置文件如例 13-8 所示,应该将它命名为 applicationContext.xml,并放在 src 目录下。

例 13-8:Spring 的配置文件 applicationContext.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"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation=

http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"

default-lazy-init="true">❶

<bean id="sessionFactory"❷

class="org.springframework.orm.hibernate3.annotation.Annotation

SessionFactoryBean">

<property name="annotatedClasses">❸

<list>

<value>com.oreilly.hh.data.Album</value>

<value>com.oreilly.hh.data.AlbumTrack</value>

<value>com.oreilly.hh.data.Artist</value>

<value>com.oreilly.hh.data.StereoVolume</value>

<value>com.oreilly.hh.data.Track</value>

</list>

</property>

<property name="hibernateProperties">❹

<props>

<prop key="hibernate.show_sql">false</prop>

<prop key="hibernate.format_sql">true</prop>

<prop key="hibernate.transaction.factory_class">org.hibernate.

transaction.JDBCTransactionFactory</prop>

<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect

</prop>

<prop key="hibernate.connection.pool_size">0</prop>

<prop key="hibernate.connection.driver_class">org.hsqldb

.jdbcDriver</prop>

<prop key="hibernate.connection.url">jdbc:hsqldb:data/music;

shutdown=true</prop>

<prop key="hibernate.connection.username">sa</prop>

<prop key="hibernate.connection.password"></prop>

</props>

</property>

</bean>

<!--enable the configuration of transactional behavior based on

annotations-->

<tx:annotation-driven transaction-manager="transactionManager"/>❺

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref local="sessionFactory"/>

</property>

</bean>

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotation

BeanPostProcessor"/>❻

<!--Define our Data Access beans-->

<bean id="albumDAO"class="com.oreilly.hh.dao.hibernate.AlbumHibernateDAO">❼

<property name="sessionFactory"ref="sessionFactory"/>

</bean>

<bean id="artistDAO"class="com.oreilly.hh.dao.hibernate.ArtistHibernateDAO">

<property name="sessionFactory"ref="sessionFactory"/>

</bean>

<bean id="trackDAO"class="com.oreilly.hh.dao.hibernate.TrackHibernateDAO">

<property name="sessionFactory"ref="sessionFactory"/>

</bean>

<!--Define our Test beans-->

<bean id="createTest"class="com.oreilly.hh.CreateTest">❽

<property name="trackDAO"ref="trackDAO"/>

<property name="artistDAO"ref="artistDAO"/>

</bean>

<bean id="queryTest"class="com.oreilly.hh.QueryTest">

<property name="trackDAO"ref="trackDAO"/>

</bean>

<bean id="albumTest"class="com.oreilly.hh.AlbumTest">

<property name="albumDAO"ref="albumDAO"/>

<property name="artistDAO"ref="artistDAO"/>

<property name="trackDAO"ref="trackDAO"/>

</bean>

</beans>

嗯,要读的 XML 代码量还不小,不是吗?其实在这个文件中还有很多有趣的东西,接下来就细细梳理一下这个文件中的每个部分:

❶顶级元素是<beans>,为了让 Spring 能够正常运行,我们必须为其声明一些重要的命名空间。http://www.springframework.org/schema/beans 命名空间是用于描述声明的 bean 元素的默认命名空间,而 http://www.springframework.org/schema/tx 命名空间则用于定义标注驱动的事务配置,本章稍后会介绍这一内容。<default-lazy-init>属性控制 Spring IoC 容器的默认行为。如果该默认设置为 true,则只有当请求组件时,Spring 才会实例化这些组件。如果把 default-lazy-init 设置为 false,则 Spring 在 ApplicationContext 初始化期间就实例化相关的 bean。

❷会话工厂这个 bean 负责生成会话对象,处理到 JDBC DataSource 的连接。通常,会话工厂将使用一个 DataSource,我们在 applicationContext.xml 中可以为会话工厂配置一个 Commons DBCP 或 C3P0 连接。为了保持这个例子的完整性,会话工厂的配置直接包含了用于配置 JDBC 连接的各属性。

❸和在 hibernate.cfg.xml 文件中进行配置一样,此处是在定义需要 Hibernate 处理的标注类。

❹hibernateProperties 元素用于配置 Hibernate 的设置。稍后在本章的 13.3.1 节再深入介绍这一配置的细节。

❺事务管理相关的标注配置稍后在本章的 13.4.1 节再深入介绍。tx:annotation-driven 元素和 transactionManager 定义可以让我们使用 Transactional 标注来定义应用程序中任何事务的范围和属性。

❻RequiredAnnotationBeanPostProcessor 是一个没有命名的组件,有了这个组件,就可以为带有 Required 标的 setter 方法激活一些强制处理。如果将这个 Required 标注属性放在必需的 bean 属性的 setter 方法上,Spring 就会在初始化一个 bean 后,再验证这个属性是否被设置。在测试类中可以用这种方法来确保 Spring 已经配置好了我们的 DAO 依赖。

❼在这里定义好了 DAO 对象:albumDAO、artistDAO 以及 trackDAO。

❽在这里定义好了 test bean:createTest、queryTest 以及 albumTest。

Hibernate 配置属性

仔细看看例 13-8 中的 hibernateProperties 部分,其中有许多有趣的配置属性,分别解释如下:

hibernate.connection.driver_class、hibernate.connection.url、hibernate.connection.username、hibernate.connection.password

这几个配置属性负责配置数据库的 JDBC 连接。这些属性与前面几章中的配置属性类似,它们在 applicationContext.xml 中的属性值与早先在 hibernate.cfg.xml 和 hibernate.properties 中的取值完全一样。

hibernate.connection.pool_size

这个属性用于设置 Hibernate 内部连接池(connection pool)容量的大小。如果不使用 Hibernate 提供的连接池,也可以使用 Hibernate 内建的支持 Apache Commons DBCP 或 C3P0,对于产品级系统的部署,这两种连接池都是很好的选择。如果将这个属性值设置成一个非零的数值,Hibernate 就会负责回收和重用数据库的连接。

这种情况很有趣,因为我想为这个示例关掉连接池,以简化 HSQLDB 的使用,所以将 pool_size 设置为 0。当最后一个数据库连接终止时,HSQLDB 需要接收一个 SHUTDOWN 命令,因为在这里我不想再编写和配置一个专门的关闭脚本,而是简单地保证在用完 JDBC Connection 对象后就马上关闭它。

hibernate.dialect

这个属性用于设置 Hibernate 方言(dialect)。现在 Hibernate 支持的所有方言列表,请参阅附录 C。

hibernate.transaction.factory_class

在这个示例中,我们使用 JDBC 驱动程序来管理数据库事务。更复杂的部署环境需要使用 JTA,如果我们使用容器托管的事务,则可以将该属性配置为 org.hibernate.transaction.JTATransactionFactory。

hibernate.show_sql、hibernate.format_sql

如果将 show_sql 设置为 true, Hibernate 将打印输出它正在执行的 SQL 语句。如果你在调试 Spring,想弄清楚某个映射是怎么访问数据库表的,这个配置属性就很有用。如果将 format_sql 设置为 true,就会格式化输出的 SQL 语句;如果将 format_sql 设置为 false, SQL 语句只打印输出到一行。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。