3
回答
关于继承HibernateDaoSupport但不传递sessionFactory的疑问
科大讯飞通用文字识别100000次/天免费使用。立即申请   

做hibernate持久层基类的时候,继承了HibernateDaoSupport,但是没有为HibernateDaoSupport这个父类传递sessionFactory,为什么这个持久层基类还能够通过getHibernateTemplate().save(domain)登进行一系列的增删改查操作?

举报
行水
发帖于5年前 3回/2K+阅
共有3个答案 最后回答: 4年前

你要注意你的配置文件设置的注入方式是按名称还是类型等,如果配置啦,spring会根据名字相同或者类型相同,直接使用setter方法注入进去的,如果还不确认什么时候注入进去的可以在setter方法上面设置断点,debug跟踪进去就一清二楚啦

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
       http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/tx 
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop 
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd" default-autowire="byName">
	<import resource="base-context.xml" />
	<import resource="persistence-context.xml" />

</beans>
或者在bean上面

<bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter" autowire="byName">



--- 共有 1 条评论 ---
行水十分感谢你的答案。的确在spring配置文件中的最上面有default-autowire="byName"。按名称注入的。没有注意到。 谢谢啦! 4年前 回复
额,sessionFactory在bean配置文件里面已经注入了的。
--- 共有 2 条评论 ---
淘淘我的小宝宝回复 @行水 : 其实sessionFactory会通过set方式注入到HibernateDaoSupport,可以看看源码. 4年前 回复
行水谢谢你的回答,遗憾的是在spring配置文件中也没有显示的将sessionFactory注入给hibernateTemplate。仅仅将sessionFactory注入给了事务管理器HibernateTransactionManager 4年前 回复

其实sessionFactory会通过set方式注入到HibernateDaoSupport,可以看看源码.

你自己定义的dao配置了sessionFactory,

比如

<bean id="logDao" class="com.bjhit.eranges.dao.impl.LogDaoImpl"
		p:sessionFactory-ref="sessionFactory" />



那么就会注入到父类,因为只有父类才定义了setSessionFactory方法,而且是final的,就是防止子类去复写它。如果你不继承HibernateDaoSupport是完全可以自己手动注入SeesionFactory的。springHibernateDaoSupport提供这个类只是为了操作方便简单。

希望你能理解了

public abstract class HibernateDaoSupport extends DaoSupport {
	private HibernateTemplate hibernateTemplate;

	public final void setSessionFactory(SessionFactory sessionFactory) {
		if ((this.hibernateTemplate == null)
				|| (sessionFactory != this.hibernateTemplate
						.getSessionFactory()))
			this.hibernateTemplate = createHibernateTemplate(sessionFactory);
	}





顶部