原文引自:http://www.javaeye.com/pages/viewpage.action?pageId=1141
作者: 冰云
整理:robbin
原理:利用Hibernate3提供的PostLoadEventListener在loadHibernate實體類的時候觸發PostLoadEvent事件,編寫一個自定義的事件監聽器,注入依賴的Spring Bean對象
SpringHibernateInjector
import org.hibernate.event.PostLoadEvent; import org.hibernate.event.PostLoadEventListener; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; public class SpringHibernateInjector implements PostLoadEventListener, BeanFactoryAware{ AutowireCapableBeanFactory beanFactory; public void onPostLoad(PostLoadEvent event) { Object hibernateObject = event.getEntity(); beanFactory.autowireBeanProperties(hibernateObject, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false); } public void setBeanFactory(BeanFactory factory) { beanFactory = (AutowireCapableBeanFactory) factory; } }
applicationContext.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="mappingResources"> <list> ...domains.hbm.xml here... </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.Oracle9Dialect </prop> <prop key="hibernate.query.substitutions"> true 1, false 0 </prop> <prop key="hibernate.show_sql">false</prop> </props> </property> <property name="eventListeners"> <map> <entry key="post-load"> <!-- This hibernate interceptor allows us to use Spring to inject services into Hibernate managed domain objects --> <bean class="yourpackage.SpringHibernateInjector"/> </entry> </map> </property> </bean>
注:此方法來自于ThoughtWorks的 PerrynFowler
,俺只是摘抄一下