今天又一次在整合SSH的时候,突然报错了'sessionFactory' or 'hibernateTemplate' is required,先前也写过博客来整合SSH框架,但是先前的框架都是用XML文件进行配置的,而这次小编为了省事想通过注解形式来进行注入,但是报出了上面的错误。
底层BaseDaoImpl继承了HibernateDaoSupport类,咱们都知道HibernateDaoSupport中报错了SessionFactory的相关信息,还报错了HibernateTemplate模板方法的信息,刚开始小编是这么来写的。
<span style="font-family:Comic Sans MS;font-size:18px;">public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
@Resource
private SessionFactory sessionFactory;
}</span>
直接在BaseDaoImpl实现类中,想注入sessionFactory,傻傻的很天真,还是对底层机制了解的不是很深刻,其实在HibernateDaoSupport中已经有SessionFactory的引用了,在此就不需要在添加对SessionFactory的引用,但是需要为sessionFactory中进行注入,引用在HibernateDaoSupport中用到了sessionFactory,注入的sessionFactory的目的是为了实例化HibernateTemplate,我们看一下底层源码
<span style="font-family:Comic Sans MS;font-size:18px;">public final void setSessionFactory(SessionFactory sessionFactory) {
if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
this.hibernateTemplate = createHibernateTemplate(sessionFactory);
}
}</span>
上述源码中,直接用sessionFactory来创建HibernateTemplate,难怪会报'sessionFactory' or 'hibernateTemplate' is required,要不让给我sessionFactory来创建HibernateTemplate,要不然直接给我一个HibernateTemplate,怎么来解决呢,我们重写一下这个方法即可,在set方法中为父类方法赋值即可
<span style="font-family:Comic Sans MS;font-size:18px;">public abstract class BaseDaoImpl<T> extends HibernateDaoSupport implements BaseDao<T> {
@Resource
public void setSessionFacotry(SessionFactory sessionFacotry) {
super.setSessionFactory(sessionFacotry);
}
}</span>