大部分时候我们都是通过xml配置方式向DAO中注入sessionfactory来实例化bean,有时候要DAO的实例化是通过注解的方式来实现。
对dao注解的话,最大的障碍是如何同时通过注解注入sessionfactory。
dao继承自HibernateDaoSupport ,sessionfactory来自于HibernateDaoSupport 中,我们无法修改HibernateDaoSupprot中的sessionfactory属性进行注解,我们也无法对final类型的setSessionfactory方法进行重写,故而要想把sessionfatory注入就得另外想办法了。
无论何种方法,本质上都是把sessionfactory赋给HibernateDaoSupprot中的sessionfactory,只有这样我们才能任意的使用HibernateDaoSupport中的任何方法。
第一个方法:通过@Resouce--按名字注入(@Autowired--按类型注入)注入,并执行方法体内容
- public final void setSessionFactory(SessionFactory sessionFactory) {
- if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
- this.hibernateTemplate = createHibernateTemplate(sessionFactory);
- }
- }
- public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
- this.hibernateTemplate = hibernateTemplate;
- }
解决方法:
- @Transactional
- @Repository("baseLocationDao")
- public class BaseLocationDaoImpl extends HibernateDaoSupport implements LocationDao{
- private Logger logger = LoggerFactory.getLogger(BaseLocationDaoImpl.class);
- @Resource
- public void setMySessionFactory(SessionFactory sessionFactory){
- super.setSessionFactory(sessionFactory);
- }
- }
第二种方法:上面的@Resource注释其实有两种效果,一个是表示该方法在dao实例化时需要执行,另一个效果则是注入了一个sessionfactory给方法。两者合并最终把注入的sessionfactory赋给了超类中的sesseionfactory属性,得到类似注入的结果,可以直接使用超类中的各种方法无碍。那么这第二种方法则是第一种方法两个效果的分开进行。
@Repository
public class TestDAOImpl extends HibernateDaoSupport implements
ITestDAO {
/**
* 注入mySessionFactory
*/
@Autowired@Qualifier("mySessionFactory") /*****注入*****/
protected SessionFactory mySessionFactory;
@PostConstruct /*****bean实例化时执行该方法*******/
protected void injectSessionFactory(){
super.setSessionFactory(mySessionFactory);
}
}
该方法分开两步,一步注入,一步赋值。
第三种方法:继承HibernateDaoSupport类,大部分都是为了使用其HibernateTemplate类中的各种方法,那么可以通过组合方式而非继承方式来达到这个目的。
public class TestDaoImp implements ITestDao{
HibernateTemplate hibernateTemplate;
@Resource
public void setMysessionFactory(SessionFactory sessionFactory){
this.hibernateTemplate = new HibernateTemplate(mySessionFactory);
}
public HibernateTemplate getHibernateTemplate(){
return hibernateTemplate;
}
}
通过这种方法就可以引用getHibernateTemplate()方法来使用了。
同样的按照第二种方法也可以改为:
@Autowired@Qualifier("mySessionFactory") /*****注入*****/
protected SessionFactory mySessionFactory;
@PostConstruct /*****bean实例化时执行该方法*******/
protected void injectHibernateTemplate(){
this.hibernateTemplate = new HibernateTemplate(mySessionFactory);
}
第四种方法;同上面一样,都是组合方式,不过注入的是HibernateDaoSupport的子类(hibernatedaosupport能否直接在xml配置为bean我不晓得了),且该子类先在xml中配置为bean。
可以通过先在xml中配置这样一个bean,然后通过组合引用HibernateDaoSupport,注入bean,直接使用其方法。