Spring中LocalSessionFactoryBean與SessionFactory


相信不少人多糾結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的實例


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM