1.Spring中,不提供具体的ORM实现,而只是为应用提供对ORM产品的集成环境和使用平台,SpringHibernate的会话工厂通过IoC容器管理起来,并且将数据源注入,同时SpringHibernate提供了更上层的API封装,方便应用调用,本文通过分析相应源码了解SpringHibernate支持的实现。

2.AbstractSessionFactoryBean管理Hibernate会话工厂:

使用过Hibernate的人都知道,HibernateSessionFactory(会话工厂)Hibernate的基础,SessionFactory管理Hibernate的相关配置和映射资源,Spring中通过AbstractSessionFactoryBean抽象类来管理Hibernate的会话工厂,AbstractSessionFactoryBean实现Spring的工厂Bean(FactoryBean)接口,因此AbstractSessionFactoryBean是一个Spring的工厂Bean,即Spring管理HibernateIoC容器,AbstractSessionFactoryBean的源码如下:

通过分析SpringHibernate会话工厂管理的IoC容器AbstractSessionFactoryBean的源码,我们可以了解到,AbstractSessionFactoryBean继承了InitializingBean接口,并实现了其afterPropertiesSet方法,该方法是在Spring IoC容器初始化完成之后由IoC容器回调的方法,分析AbstractSessionFactoryBean的工作流程如下:

(1).Spring管理Hibernate会话工厂的IoC容器AbstractSessionFactoryBean初始化完成,IoC容器回调afterPropertiesSet方法创建单态模式的Hivbernate会话工厂。

(2).应用通过getObject方法向Spring管理Hibernate会话工厂的IoC容器AbstractSessionFactoryBean索取Hibernate会话工厂。

下面我们继续分析AbstractSessionFactoryBean子类LocalSessionFactoryBean创建Hibernate会话工厂的过程。

3.LocalSessionFactoryBean创建SessionFactory

Spring中管理Hibernate会话工厂的IoC容器AbstractSessionFactoryBean通过委派模式调用其子类LocalSessionFactoryBeanbuildSessionFactory创建Hibernate会话工厂,源码如下:

上述代码非常的长,但是所做的工作非常的清楚,即获取Hibernate的配置,然后设置Hibernate配置,最后生成SessionFactory的过程。

4.HibernateTemplate实现:

Springjdbc封装类似,Spring使用HibernateTemplateHibernate也进行了一下API封装,通过execute回调来调用Hibernate的相关操作处理,接下来简单分析HibernateTemplate的核心实现。

(1). execute相关方法的实现:

JdbcTemplate类似,execute相关方法也是HibernateTemplate的基础核心方法,在execute相关方法中,Spring提供获取Hibernate Session,为当前的Session进行事务处理等通用的操作,源码如下:

(2).HibernateTemplate中增删改查操作的简单实现:

以查询为例,分析HibernateTemplate如何通过execute方法回调Hibernate相应的API,源码如下:

其他的loadupdate等等调用Hibernate的方法类似,各自提供不同的HibernateCallback回调来真正调用Hibernate相应方法。

5.Hibernate管理Session

4分析HibernateTemplatedoExecute法源码时我们看到,Spring根据是否需要新Session的判断,使用getSessiongetNewSession两种不同的获取Session的方法,Spring中通过SessionFactoryUtils来管理HibernateSession,分析SessionFactoryUtils管理Session的实现源码:

(1).getNewSession实现:

(2).getSession实现:

通过上面SpringHibernate Session管理的源码分析,我们了解到Spring已经将Hibernate Session的获取与关闭,Session的事务处理,以及Session与线程资源绑定等操作做了封装统一管理,为应用使用Hibernate提供了方便。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐