Spring : 集成Hibernate 理解LocalSessionFactoryBean

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 就可以了。












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值