1. 程式人生 > >使用註解為HibernateDaoSupport注入sessionFactory

使用註解為HibernateDaoSupport注入sessionFactory

http://blog.csdn.net/tsingheng/article/details/8847047

都知道spring提供的有零配置功能,而且看見別人的一個專案使用spring+mybatis,只在applicationContext.xml裡定義了sqlSessionFactory,然後什麼都不用配置了,baseDao繼承自SqlSessionDaoSupport,只需要在每個dao上加@Repository註解,spring會自動向物件中注入sqlSessionFactory物件。

我用hibernate模仿著人家的例子,我也只在applicationContext.xml裡定義了sessionFactory,basedao繼承自HibernateDaoSupport,結果怎麼弄都報錯啊,'sessionFactory'

 or 'hibernateTemplate' is required

追查了良久,發現SqlSessionDaoSupport和HibernateDaoSupport是不一樣的,前者有這樣的一個方法

  1. @Autowired(required=false)  
  2. privatevoid setSqlSessionFacoty(SqlSessionFacoty sqlSessionFacoty){  
  3.     this.sqlSessionFacoty = sqlSessionFacoty;  
  4. }  
而後者的方法是
  1. publicvoid setSessionFacoty(SessionFacoty sessionFactory){  
  2.     this.sessionFactory = sessionFacoty;  
  3. }  


後者是沒有@Autowired的,所以spring是不會為繼承HibernateDaoSupport的物件自動裝配sessionFacotry的

那麼如何解決這個問題就有很多途徑了,比如你自己把HibernateDaoSupport的程式碼拷出來加個自動裝配的註解,當做自己的實現。

最簡單的方法,在BaseDao里加入一個方法

  1. @Autowired
  2. publicvoid setMySessionFactory(SessionFactory sessionFactory){  
  3.     super
    .setSessionFactory(sessionFactory);  
  4. }  

spring會按照型別自動裝配,所以方法名稱可以隨便寫,這樣就可以為子類的物件自動注入sessionFactory了。

也可以如下這樣寫

@Resource(name = "sessionFactory")
public void setSuperSessionFactory(SessionFactory sessionFactory) {
super.setSessionFactory(sessionFactory);
}

@autowired和@resource的區別

@Autowired註解是按型別裝配依賴物件,預設情況下它要求依賴物件必須存在,如果允許null值,可以設定它required屬性為false。如果我們想使用按名稱裝配,可以結合@Qualifier註解一起使用。如下: 
    @Autowired  @Qualifier("personDaoBean") 
    private PersonDao  personDao; 

@Resource註解和@Autowired一樣,也可以標註在欄位或屬性的setter方法上,但它預設按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當註解標註在欄位上,即預設取欄位的名稱作為bean名稱尋找依賴物件,當註解標註在屬性的setter方法上,即預設取屬性名作為bean名稱尋找依賴物件。 
    @Resource(name=“personDaoBean”) 
    private PersonDao  personDao;//用於欄位上 

注意:如果沒有指定name屬性,並且按照預設的名稱仍然找不到依賴物件時, @Resource註解會回退到按型別裝配。但一旦指定了name屬性,就只能按名稱裝配了。