Spring Framework在资源管理,DAO实现支持以及事务策略等方面提供了与 Hibernate、JDO、Oracle TopLink、iBATIS SQL Mappings 以及 JPA 的集成。
所有用于支持O/R(对象关系)映射的包,都遵循Spring通用的事务和DAO异常体系。
通常来说有两种不同的整合风格:你可以使用Spring提供的DAO模板,或者直接使用Hibernate/JDO/TopLink等工具的原生API编写DAO。
无论采取哪种风格,这些DAO都可以通过IoC进行配置,并参与到Spring的资源和事务管理中去。
使用Spring Framework构建你的O/R Mapping DAO的好处包括:
便于测试。
通用数据访问异常封装。
通用的资源管理。
完整的事务管理。
在Spring发布包中的PetClinic提供了各种可选择的DAO实现和application context对JDBC、Hibernate、Oracle TopLink和JPA的配置。
JPetStore示例主要举例说明了iBATIS SQL Maps在Spring环境中的使用。
在典型的Spring应用程序中,很多重要的对象都是JavaBeans:数据访问template、数据访问对象(使用template)、事务管理器、业务逻辑对象(使用数据访问对象和事务管理器)、web视图解析器、web控制器(使用业务服务)等等。
为了避免硬编码的资源查找与应用程序对象紧密耦合,Spring允许你在Spring容器中以bean的方式定义诸如JDBC DataSource或者Hibernate SessionFactory 的数据访问资源。
任何需要进行资源访问的应用程序对象只需要持有这些事先定义好的实例的引用。
对于外部对象来说,没有任何实现特定接口的约束,仅仅要求提供一个Hibernate SessionFactory。
它可以从任何地方得到,不过比较适宜的方法是从Spring的IoC容器中取得bean的引用:通过简单的 setSessionFactory(..) 这个bean的setter方法。
HibernateTemplate类提供了大量方法对应Hibernate Session接口中暴露的方法:快捷函数以及回调实现。
HibernateTemplate 会确保当前Hibernate的 Session 实例的正确打开和关闭,并直接参与到事务管理中去。
Template实例不仅是线程安全的,同时它也是可重用的。因而他们可以作为外部对象的实例变量而被持有。
Spring还提供了一个简便的 HibernateDaoSupport 基类,这个类提供了 setSessionFactory(..) 方法来接受一个 SessionFactory 对象,同时提供了 getSessionFactory() 和 getHibernateTemplate() 方法给子类使用。
不使用回调的基于Spring的DAO实现:
不使用Spring的 HibernateTemplate 来实现DAO的替代解决方案,你依然可以用传统的编程风格来编写你的数据访问代码。
无需将你的Hibernate访问代码包装在一个回调中,只需符合Spring的通用的 DataAccessException 异常体系。
HibernateDaoSupport 基类提供了访问与当前事务绑定的 Session 对象的函数,因而能保证在这种情况下异常的正确转化。
类似的函数同样可以在 SessionFactoryUtils 类中找到,但他们以静态方法的形式出现。
整个调用将在同一个事务内完成(它的整个生命周期由事务控制,避免了关闭返回的 Session 的需要)。
直接使用Hibernate访问代码的好处在于它允许你在数据访问代码中抛出 任何 checked exception,而 HibernateTemplate 却受限于回调中的unchecked exception。
基于Hibernate3的原生API实现DAO:
Hibernate3 引入了一个新的特性:“带上下文环境的Session”。 这一特性使得Hibernate自身具备了每个事务绑定当前 Session 对象的功能。
这与Spring中每个Hibernate的 Session 与事务同步的功能大致相同。
DAO遵循依赖注入模式:它如同使用Spring的 HibernateTemplate 进行编程那样,适合在Spring IoC容器中进行配置。仅仅需要初始化这个类, 调用 setSessionFactory(..) 方法设置你所期望的工厂资源。
这种DAO访问方式的主要优势在于它仅仅依赖于Hibernate API本身而无需引入任何Spring的类。
这样的DAO访问方式会抛出原生 HibernateException (这是一个无需声明或捕获的unchecked exception),
这意味着,DAO的调用者只能以致命的错误来处理这些异常,除非完全依赖Hibernate自身的异常体系。
因而,除非你将DAO的调用者绑定到具体的实现策略上去,否则你将无法捕获特定的异常原因,诸如乐观锁异常。
编程式的事务划分:
我们可以在这些低层次的数据访问服务之上的应用程序进行更高层次的事务划分,从而让事务能够横跨多个操作。
对于相关的业务逻辑对象同样没有实现接口的限制,它只需要一个Spring的 PlatformTransactionManager。
同SessionFactory一样,它可以来自任何地方,但是最好是一个经由 setTransactionManager(..) 方法注入的bean的引用,正如使用 setProductDao 方法来设置 productDAO 一样。
声明式的事务划分:
声明式的事务支持通过配置Spring容器中的AOP Transaction Interceptor来替换事务划分的硬编码。
高级别的声明式的事务管理方案并没有使用 ProxyFactoryBean,它将使那些大量的业务对象需要被纳入到事务管理中时的配置变得非常简单。
事务管理策略
TransactionTemplate 和 TransactionInterceptor 都将真正的事务处理委托给一个 PlatformTransactionManager 实例来处理。
在Hibernate应用中,它可以是一个 HibernateTransactionManager(对于单独一个的Hibernate SessionFactory 使用一个 ThreadLocal 的 Session)
或一个 JtaTransactionManager(代理给容器的JTA子系统)。
对于横跨多个Hibernate SessionFacotry的分布式事务,只需简单地将 JtaTransactionManager 同多个 LocalSessionFactoryBean 的定义结合起来作为事务策略。
你的每一个DAO通过bean属性得到各自的 SessionFactory 引用。
如果所有的底层JDBC数据源都是支持事务的容器,那么只要业务对象使用了 JtaTransactionManager 作为事务策略,它就可以横跨多个DAO和多个session factories来划分事务,而不需要做任何特殊处理。
HibernateTransactionManager 能够自动地将Hibernate事务暴露为JDBC事务,如果你通过设置 DataSource来建立SessionFactory 对象(通过设置 LocalSessionFactoryBean 中的“dataSource”属性)。
另外一种配置方法是通过设置 HibernateTransactionManager 的“dataSource”属性,明确指定事务需要暴露的 DataSource。
容器资源 vs 本地资源:
Spring的资源管理允许你简单地在一个JNDI的 SessionFactory 和一个本地的 SessionFactory 之间切换而无需更改任何一行应用程序代码。
Spring对事务管理的支持有一个非常重要的好处:它不依赖于任何容器。
Spring驱动的事务管理与本地定义的 SessionFactory 能够工作得非常好,就像使用本地的JDBC DataSource 一样,当然前提必须是访问单个数据库。 因此当你真正面对分布式事务的需求时,可以马上回到Spring的JTA事务。
把Hibernate配置成感知到JTA PlatformTransactionManager 实例的存在即可,同时将他们进行同步(与Spring同步)。
Hibernate被配置成不感知JTA PlatformTransactionManager 以及配置成感知JTA PlatformTransactionManager?????
JDO:
Spring支持标准的JDO 1.0/2.0 API作为数据访问策略。
Spring提供了一个 LocalPersistenceManagerFactoryBean 类,允许你通过Spring的application context来定义一个本地的JDO PersistenceManagerFactory
iBATIS SQL Maps:
在Spring框架中,iBatis的支持很类似JDBC或者Hibernate的支持。
因为它和JDBC或Hibernate一样支持相同的模板式编程, iBatis的支持能与Spring的异常体系一起工作并让你享用所有Spring的Ioc特点。
事务管理可以由Spring标准机制进行处理。
对于iBATIS来说没有特别的事务策略,除了JDBC Connection 以外,也没有特别的事务资源。
因此,Spring 标准的JDBC DataSourceTransactionManager 或者 JtaTransactionManager 已经能够完全足够了。
使用 SqlMapClientTemplate 和 SqlMapClientDaoSupport:
SqlMapClientDaoSupport 提供了类似 SqlMapDaoSupport 的功能。
基于原生的iBATIS API的DAO实现:
你也可以基于原生的iBATIS API来编程,而无需对Spring产生任何依赖。直接使用注入的 SqlMapClient。
将事务管理纳入到Service操作的执行中,你可以使用Spring通用的声明式的事务管理功能。JPA
作为一个高级特性,JpaTemplate、JpaTransactionManager 和 AbstractEntityManagerFactoryBean 的子类支持用户自定义的 JpaDialect 作为"jpaDialect"的bean属性进行注入。
JpaDialect 实现能够激活一些由Spring支持的高级特性,这通常由特定的 实现供应商指定:
使用特定的事务语义(例如用户自定义的事务隔离级别和事务超时)
获取具备事务功能的Connection对象(暴露给基于JDBC的DAO)
从 PersistenceExceptions 到Spring的 DataAccessExceptions 高级转化。
分享到:
相关推荐
3. **集成现有技术**:Spring能够很好地与其他技术如ORM框架、日志框架、定时任务框架等协同工作。 4. **模块化**:Spring框架的模块化设计让开发者可以根据项目需求选择合适的模块,减少不必要的代码负担。 5. ...
依赖注入是 Spring 框架的核心特性之一,它使得对象之间的依赖关系不再硬编码,而是通过外部容器来管理。Spring 使用接口注入,构造器注入和 setter 注入三种方式实现 DI,帮助开发者减少代码的耦合度,提高可测试性...
在这个名为 "spring mvc需要用的jar完整整理" 的压缩包中,包含了一系列支持 Spring MVC 开发所需的 jar 包。下面将详细介绍这些 jar 包以及它们在 Spring MVC 应用中的作用。 1. **spring-webmvc.jar**:这是 ...
Spring框架是Java开发中最常用的轻量级框架之一,它以其模块化、易用性和灵活性而闻名。本手册主要涵盖了Spring框架的两个主要版本——Spring 2.x和Spring 3.x,由FengGe精心整理,旨在帮助开发者快速查找和理解...
Spring作为Java领域最流行的轻量级框架之一,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)理念,极大地简化了企业级应用的开发工作。 本手册以CHM(Compiled ...
`3 整理模板(spring+mybatis)` 文件可能是包含了一个完整的 Spring + MyBatis 项目模板,可能包括以下部分: - **配置文件**:如 `spring-context.xml`(Spring 配置)、`mybatis-config.xml`(MyBatis 配置)。 ...
Spring框架是Java开发中最常用的轻量级框架之一,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心特性,极大地简化了企业级应用的开发工作。这份“Spring面试...
2. **面向切面编程(AOP)**:Spring支持AOP,可以在不修改业务逻辑代码的情况下,实现日志记录、事务管理等功能。 3. **统一异常处理**:Spring提供了统一的异常处理机制,使得错误处理更加集中和规范。 #### 为...
2. `postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)`: 请求处理完成后,但在视图渲染之前调用,通常用于数据整理或者共享数据到视图。...
这个"Spring-jar包集合"显然是一系列与Spring框架相关的jar文件,可能是为了方便开发者在项目中快速集成和使用Spring功能而整理的。在这里,我们将深入探讨Spring框架的主要组件和功能,以及如何使用jar包进行开发。...
及时记录和整理调试过程,形成知识积累。 总的来说,理解和掌握SSH框架的调试技巧,不仅能提升项目的开发效率,也能帮助开发者更好地应对复杂业务场景。通过不断实践和总结,我们可以将这些经验转化为宝贵的专业...
3. **Web层集成ORM**:Spring框架还支持多种ORM技术,如Hibernate、JDO等,这些技术可以大大简化数据访问层的开发工作。 #### 2.5.2. Web层集成Spring与第三方框架 在Web层集成Spring的同时,还可以与其它流行的...
Spring框架是Java开发中最常用的轻量级框架之一,它提供了丰富的功能来简化应用程序的构建和管理。在Maven项目中,正确配置Spring的依赖是非常重要的。以下是对Spring框架各核心模块及其Maven配置文件的详细解释: ...
7. **阅读笔记**:随书阅读笔记是学习过程中的重要辅助资料,可以帮助读者整理思绪,记录关键点,解决疑惑,提高学习效果。笔记可能包括概念解释、代码示例、问题解答和实战经验分享等。 总的来说,《Spring in ...
Spring框架是Java开发中最常用的轻量级开源框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,旨在简化企业级应用的开发。这份"Spring学习思维笔记...
- **Spring ORM**:为常用的ORM框架(如Hibernate、JPA等)提供了一致的集成方案。 - **Spring Web**:支持基于Web的应用程序开发,包括对Servlet API的支持。 - **Spring MVC**:提供了模型-视图-控制器架构的实现...
Spring MVC提供了一种模型-视图-控制器(MVC)架构,使得开发者能够有效地组织和管理应用程序的业务逻辑,而Hibernate则是一个强大的对象关系映射(ORM)工具,它简化了数据库操作,使开发者可以使用Java对象来操作...
3. **适配器模式**:在Spring的许多模块中,如JDBC、ORM和Web MVC中,可以看到适配器模式的应用,以提高灵活性和扩展性。 4. **单例模式**:Spring默认为Bean采用单例模式,即容器中只有一个Bean实例。 5. **装饰器...
**Hibernate框架**:Hibernate是一个强大的对象关系映射(Object-Relational Mapping,ORM)框架,它简化了Java应用与数据库之间的交互。Hibernate允许开发者使用Java对象来操作数据库,而无需编写SQL语句。它提供了...