先看一段常見的Spring+Hibernate內建的配置檔案
<bean name="hibernate.sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="system.datasource"/>
<property name="cacheProvider" ref="hibernate.cacheProvider"/>
......
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<constructor-arg ref="hibernate.sessionFactory"/>
</bean>
從AnnotationSessionFactoryBean命名我們知道這個是個FactoryBean,Spring中工廠Bean跟普通的Bean注入是有差別的;普通的Bean是通過Setxxx、Getxxxx或者構造器的方式,直接根據類型比對就能注入。但是工廠Bean-AnnotationSessionFactoryBean跟SessionFactory根本不是同一個類型,但是他們依然能夠實作注入,原因是工廠Bean重寫了getObject()方法,此方法會傳回一個SessionFactory,這樣就能通過構造器的方式順利的注入到HibernateTemplate中了。
附件是個Maven項目的小例子,簡單的模拟了Spring将SessionFactory注入到HibernateTemplate中的過程。