使用註解為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'
追查了良久,發現SqlSessionDaoSupport和HibernateDaoSupport是不一樣的,前者有這樣的一個方法
- @Autowired(required=false)
- privatevoid setSqlSessionFacoty(SqlSessionFacoty sqlSessionFacoty){
- this.sqlSessionFacoty = sqlSessionFacoty;
- }
-
publicvoid setSessionFacoty(SessionFacoty sessionFactory){
- this.sessionFactory = sessionFacoty;
- }
後者是沒有@Autowired的,所以spring是不會為繼承HibernateDaoSupport的物件自動裝配sessionFacotry的
那麼如何解決這個問題就有很多途徑了,比如你自己把HibernateDaoSupport的程式碼拷出來加個自動裝配的註解,當做自己的實現。
最簡單的方法,在BaseDao里加入一個方法
- @Autowired
- publicvoid setMySessionFactory(SessionFactory sessionFactory){
-
super
- }
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屬性,就只能按名稱裝配了。