通过注解的方式向DAO中注入Sessionfactory

系统 2186 0

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

 

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

 

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

 

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

 

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

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,直接使用其方法。

通过注解的方式向DAO中注入Sessionfactory


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论