您的位置:首页 > 编程语言 > Java开发

Spring : 集成Hibernate 理解LocalSessionFactoryBean

2014-01-11 15:23 363 查看
1、LocalSessionFactoryBean的使用

LocalSessionFactoryBean(org.springframework.orm.hibernate4.LocalSessionFactoryBean)是Spring和Hibernate集成的重要类。

通过在Spring的配置文件applicationContext.xml中配置LocalSessionFactoryBean作为SessionFactory创建,在创建的时候会加载

mappingResource中的具体每一个实体和具体表映射配置 XXX.hbm.xml。

若配置的映射文件较少时,可以用sessionFactory的所属类LocalSessionFactoryBean的“mappingResources”属性,方式包括

(mappingResources,mappingLocations、mappingDirectoryLocations与mappingJarLocations )定义方法如下:

 第一种:

<!--mappingResources属性用来列出全部映射文件-->
<property name="mappingResources">
<list>
<value>ExUser.hbm.xml</value>
</list>
</property>


当配置文件变得越来越多,阅读和修改起来也越来越麻烦,而且基于XML的配置也可能带来输入的错误,导致你可能因为一个字符的

错误而浪费半天时间去寻找错误。

第二种

在这种情况下,可以使用LocalSessionFactoryBean的“mappingDirectoryLocations”属性来定义映射文件,只要指出映射文件所在文

件夹就可以了,Spring会替你找出该文件夹内所有的映射文件,定义方法如下:

<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/mappings</value>
</list>
</property>


2、LocalSessionFactoryBean的原理

具体的Bean为LocalSessionFactoryBean,那为什么id为SessionFactory,实际上的Bean也是SessionFactory

<bean id="SessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!--依赖注入数据源datasource-->
<property name="dataSource" ref="DataSource" />
<!--mappingResources属性用来列出全部映射文件-->
<property name="mappingResources">
<list>
<value>ExUser.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl">validate</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.autoReconnect">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
</props>
</property>
</bean>


LocalSessionFactoryBean 本身不是一个session
factory,但是spring会自动把对这个bean的引用替换成LocalSessionFactoryBean

里面的真正的session factory。

我们先来看看LocalSessionFactoryBean 源码如下,实现了AbstractSessionFactoryBean抽象类

public class LocalSessionFactoryBean extends AbstractSessionFactoryBean implements BeanClassLoaderAware {


而在AbstractSessionFactoryBean这个抽象类中具体如下,实现了接口FactoryBean<SessionFactory>,接口的类型设置SessionFactory

public abstract class AbstractSessionFactoryBean
implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator {


接下来我们看看具体的源码接口FactoryBean<SessionFactory>

package org.springframework.beans.factory;

public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
从源码中可以看到Spring给我们接口FactoryBean<SessionFactory>很简单但是也很强大,只有三个方法

 1、getObject()返回一个对象,则需要在具体的实现类中具体看

 2、getObjectType()获取对象的类型Type

 3、isSingLeton()判断是否为单列模式

通过实现FactoryBean<SessionFactory>接口来使用上面的三个方法,我们在AbstractSessionFactoryBean抽象类的实现中使用
implementsFactoryBean<SessionFactory>,也就是Type类型为SessionFactory类型,也就是getObject该方法实际
返回的是SessionFactory类型,具体我们看看在AbstractSessionFactoryBean中三个方法的实现

public abstract class AbstractSessionFactoryBean
implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator {
private SessionFactory sessionFactory;
...
/**
* Return the singleton SessionFactory.
*/
public SessionFactory getObject() {
return this.sessionFactory;
}

public Class<? extends SessionFactory> getObjectType() {
return (this.sessionFactory != null ? this.sessionFactory.getClass() : SessionFactory.class);
}

public boolean isSingleton() {
return true;
}
}


也就是在AbstractSessionFactoryBean抽象类中有存放sessionFactory的字段,而且是private私有的,而获取方法

是公有的,现在我们回到LocalSessionFactoryBean ,因为LocalSessionFactoryBean 实现了抽象类AbstractSessionFactoryBean

也就是继承了方法getObject()方法,该方法在AbstractSessionFactoryBean抽象类中是回去私有变量SessionFactory的

所以当我们实际使用这个LocalSessionFactoryBean 的时候,比如applicationContext.getBean("localSessionFactoryBean "),

spring返回的不是LocalSessionFactoryBean 本身,而会自动调用getObject()这个方法,而这个方法把真正的session
factory返回
用<ref bean="">这样引用也一样,得到的都是session factory而不是LocalSessionFactoryBean 。所以不需要再显式地创建一个

session
factory,直接引用LocalSessionFactoryBean 就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LocalSessionFactoryB