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