在搭建SSH框架的时候在处理dao层sessionFactory注入的时候遇到一个问题,总是报sessionFactory没有注入成功,其中bean的配置如下所示
<bean id="loginDao" class="cn.com.demo.dao.impl.LoginDaoImpl" scope="prototype">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
我使用的是spring2 + hibernate4在dao实现层开始用的是extends HibernateDaoSupport的方式不行,换成extends HibernateTemplate也不行。
解决这个问题我们要搞清楚spring是怎么通过set方式注入依赖的需要配置哪些东西。
1.首先需要在bean中配置需要注入依赖的属性,如上面的代码所示
2.在需要注入依赖的类中配置一个属性,用于接收通过set方法注入的值
3.添加相应的set方法用于spring注入,这个set方法名是set + bean中配置的name对应的值,即加入xml中bean的配置种的name为sessionDemo那么spring就会通过setSessionDemo方法去注入
明确这点就好办了,接着查看了HibernateDaoSupport和HibernateTemplate源码,先看HibernateDaoSupport的源码,源码中我们发现有一个final修饰的setSessionFactory方法,我们知道final修饰的方法是不能被重写的,但是可以被继承,所以子类中是有setSessionFactory。满足了set注入的3条件,因为1中的条件已经满足所以现在只需要确定是否满足2即可。2中所有需要有属性来接收注入的值,我们继续看源码中的setSessionFactory方法,HibernateDaoSupport中是用注入的sessionFactory生成了HibernateTmeplate,并赋值给了hibernateTemplate参数。因此2也是满足的,所以只需要改成下面的代码即可注入成功。
package cn.com.demo.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import cn.com.jnpc.dao.LoginDao;
import cn.com.jnpc.entity.User;
/**
* loginDao持久层
* @author Uself 2017-10-17 下午3:15:11
*
*/
public class LoginDaoImpl extends HibernateDaoSupport implements LoginDao{
/**
* 根据userName获取User信息
*/
@Override
public User getUserByUserName(String userName) {
User user = null;
String hql = "from User where user_name = '" + userName + "'";
SessionFactory sessionFactory = this.getSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery(hql);
List list = query.list();
if(list != null && list.size() > 0){
user = (User) list.get(0);
}
session.close();
return user;
}
}
同样的继承HibernateTemplate也是类似,查看源码并和上面的三点一一对应就能正确的注入,代码如下
package cn.com.demo.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate4.HibernateTemplate;
import cn.com.jnpc.dao.LoginDao;
import cn.com.jnpc.entity.User;
/**
* loginDao持久层
* @author Uself 2017-10-17 下午3:15:11
*
*/
public class LoginDaoImpl extends HibernateTemplate implements LoginDao{
/**
* 根据userName获取User信息
*/
@Override
public User getUserByUserName(String userName) {
User user = null;
String hql = "from User where user_name = '" + userName + "'";
SessionFactory sessionFactory = this.getSessionFactory();
Session session = sessionFactory.openSession();
Query query = session.createQuery(hql);
List list = query.list();
if(list != null && list.size() > 0){
user = (User) list.get(0);
}
session.close();
return user;
}
}
值得注意的是,spring和hibernate版本之间的差异很大,如果直接使用上面的代码还是不行,就要具体的情况具体分析,也就是要去查看源码确定是否是和上面的情况类似,但是总体的思路是不变的。