通过注解方式向Dao中注入Sessionfactory

大部分时候我们都是通过xml配置方式向DAO中注入sessionfactory来实例化bean,有时候要DAO的实例化是通过注解的方式来实现。

 

对dao注解的话,最大的障碍是如何同时通过注解注入sessionfactory。

 

dao继承自HibernateDaoSupport  ,sessionfactory来自于HibernateDaoSupport 中,我们无法修改HibernateDaoSupprot中的sessionfactory属性进行注解,我们也无法对final类型的setSessionfactory方法进行重写,故而要想把sessionfatory注入就得另外想办法了。

 

无论何种方法,本质上都是把sessionfactory赋给HibernateDaoSupprot中的sessionfactory,只有这样我们才能任意的使用HibernateDaoSupport中的任何方法。

 

第一个方法:通过@Resouce--按名字注入(@Autowired--按类型注入)注入,并执行方法体内容

[java] view plain copy print ?
HibernateDaoSupprot中的方法类型为final

 

Java代码   收藏代码
  1. public final void setSessionFactory(SessionFactory sessionFactory) {  
  2.         if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {  
  3.             this.hibernateTemplate = createHibernateTemplate(sessionFactory);  
  4.         }  
  5.     }  
  6.   
  7. public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {  
  8.         this.hibernateTemplate = hibernateTemplate;  
  9.     }  



解决方法:

Java代码   收藏代码
  1. @Transactional  
  2. @Repository("baseLocationDao")  
  3. public class BaseLocationDaoImpl extends HibernateDaoSupport implements LocationDao{  
  4.     private Logger logger = LoggerFactory.getLogger(BaseLocationDaoImpl.class);  
  5.       
  6.     @Resource  
  7.     public void setMySessionFactory(SessionFactory sessionFactory){  
  8.         super.setSessionFactory(sessionFactory);  
  9.     }  
  10. }  

 

第二种方法:上面的@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,直接使用其方法。

你可能感兴趣的:(注解)