相信不少人多糾結LocalSessionFactoryBean與SessionFactory到底是什么關系,怎么去進行關聯的,正如圖所示:
transactonManager有一個對sessionFactory的引用,現在我們來看下org.springframework.orm.hibernate4.HibernateTransactionManager源碼:
我們會發現transactonManager的sessionFactory和org.springframework.orm.hibernate4.LocalSessionFactoryBean根本不是一個類型,也不存在父子關系,那怎么在spring配置文件中可以用transactonManager引用sessionFactory,下面我們看下org.springframework.orm.hibernate4.LocalSessionFactoryBean的源碼:
在afterPropertiesSet()方法中我們發現如下代碼:
,通過注釋我們知道這塊是創建SessionFactory實例,同時我們注意到如下代碼:
這段代碼是返回一個SessionFactory實例,
當引用LocalSessionFactoryBean 的時候,比如applicationContext.getBean("localSessionFactoryBean ")這樣,spring返回的不是LocalSessionFactoryBean 本身,他會自動調用getObject()這個方法,把真正的session factory返回。用<ref bean="">這樣引用也一樣,得到的都是session factory而不是LocalSessionFactoryBean 。這里代碼沒貼全,有興趣的話去看看源代碼。所以不需要再顯式地創建一個session factory,直接引用LocalSessionFactoryBean 就可以了。
LocalSessionFactoryBean實現了org.springframework.beans.factory.FactoryBean接 口, spring在裝配的時候, 如果發現實現了org.springframework.beans.factory.FactoryBean接口, 就會使用FactoryBean#getObject() 方法返回的對象裝配,具體的可以看下文檔.如果你想拿到LocalSessionFactoryBean實例, 在id前面加個'&'就可以了,在你的配置文件中BeanFactory.getBean('&sessionFactory')拿到的 就是LocalSessionFactoryBean的實例