【hibernate源码解析】之SessionFactory

SessionFactory负责构建Session实例,就像在Configuration解析中,首先给出的那段代码:

private static SessionFactory sf = null;
	
	static{
		Configuration configuration = new Configuration();
		configuration.configure("cn/huawei/config/hibernate.cfg.xml");
		configuration.addClass(Customer.class);
		sf = configuration.buildSessionFactory();
	}
configuration.buildSessionFactory()方法来返回Session的实例。那么hibernate程序是如何构建Session的实例的呢?我们从代码中找找看,当然这还是离不开Configuration这个类,还是得从这个类开始,找到buildSessionFactory()这个方法。看下面的代码:

public SessionFactory buildSessionFactory() throws HibernateException {
		log.debug( "Preparing to build session factory with filters : " + filterDefinitions );
		secondPassCompile();
		validate();
		Environment.verifyProperties( properties );
		Properties copy = new Properties();
		copy.putAll( properties );
		PropertiesHelper.resolvePlaceHolders( copy );
		Settings settings = buildSettings( copy );

		return new SessionFactoryImpl(
				this,
				mapping,
				settings,
				getInitializedEventListeners(),
				sessionFactoryObserver
			);
	}
这个方法返回的是一个sessionFactory的实例。首先我们来分析一下这个方法,这个方法是先对property这个变量里的值进行了校验,至于怎么校验的,咱们一会儿再说,校验完了之后,程序直接返回了一个new SessionFactoryImpl(this,mapping,settings,getInitializedEventListeners(),sessionFactoryObserver);咱们看一下这个方法的原始模型:
org.hibernate.impl.SessionFactoryImpl.SessionFactoryImpl(Configuration cfg, Mapping mapping, Settings settings, EventListeners listeners, SessionFactoryObserver observer) throws HibernateException

第一个参数是Configuration类的一个实例,第二个参数是mapping类的实例(里面是持久化类的一些属性),第三个参数是Settings类的实例,它通过buildSettings这个方法将配置文件中的值给解析出来方面以后使用;第四个参数是SessionFactoryObserver类型,主要的内容是观察SessionFactory打开还是关闭的。接下来我们就进入SessionFactoryImpl这个构造方法中去看看究竟:

public SessionFactoryImpl(
			Configuration cfg,
	        Mapping mapping,
	        Settings settings,
	        EventListeners listeners,
			SessionFactoryObserver observer) throws HibernateException {
		log.info("building session factory");

		Statistics concurrentStatistics = null;
		try {
			Class concurrentStatsClass = ReflectHelper.classForName("org.hibernate.stat.ConcurrentStatisticsImpl");
			Constructor constructor = concurrentStatsClass.getConstructor(new Class[]{SessionFactoryImplementor.class});
			concurrentStatistics = (Statistics) constructor.newInstance(new Object[]{this});
			log.trace("JDK 1.5 concurrent classes present");
		} catch ( NoClassDefFoundError noJava5 ) {
			log.trace("JDK 1.5 concurrent classes missing");
		} catch (Exception noJava5) {
			log.trace("JDK 1.5 concurrent classes missing");
		}

		if (concurrentStatistics != null) {
			this.statistics = concurrentStatistics;
		} else {
			this.statistics = new StatisticsImpl(this);
		}

		if ( log.i
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值