學習Spring的過程中,一直不了解為何需要用LocalSessionFactoryBean來得到SessionFactory,Google之後發現有諸多童鞋有相似的問題,于是轉載來分享:
LocalSessionFactoryBean 本身不是一個session factory,但是spring會自動把對這個bean的引用替換成LocalSessionFactoryBean 裡面的真正的session factory。
No.1
具體解釋一下:
在LocalSessionFactoryBean 這個class裡面有個字段是存放真正的session factory的:
- publicclass LocalSessionFactoryBean implements FactoryBean, InitializingBean, DisposableBean {
- private SessionFactory sessionFactory;
- public Object getObject(); {
- returnthis.sessionFactory;
- }
當引用這個LocalSessionFactoryBean 的時候,比如applicationContext.getBean("localSessionFactoryBean ")這樣,spring傳回的不是LocalSessionFactoryBean 本身,他會自動調用getObject()這個方法,把真正的session factory傳回。用<ref bean="">這樣引用也一樣,得到的都是session factory而不是LocalSessionFactoryBean 。這裡代碼沒貼全,有興趣的話去看看源代碼。
是以不需要再顯式地建立一個session factory,直接引用LocalSessionFactoryBean 就可以了。
No.2
LocalSessionFactoryBean實作了org.springframework.beans.factory.FactoryBean接 口, spring在裝配的時候, 如果發現實作了org.springframework.beans.factory.FactoryBean接口, 就會使用FactoryBean#getObject() 方法傳回的對象裝配,具體的可以看下文檔.
如果你想拿到LocalSessionFactoryBean執行個體, 在id前面加個'&'就可以了,在你的配置檔案中BeanFactory.getBean('&sessionFactory')拿到的 就是LocalSessionFactoryBean的執行個體.