通過註解的方式向DAO中注入Sessionfactory

langgufu314發表於2013-01-16

大部分時候我們都是通過xml配置方式向DAO中注入sessionfactory來例項化bean,有時候要DAO的例項化是通過註解的方式來實現。

 

對dao註解的話,最大的障礙是如何同時通過註解注入sessionfactory。

 

dao繼承自HibernateDaoSupport  ,sessionfactory來自於HibernateDaoSupport 中,我們無法修改HibernateDaoSupprot中的sessionfactory屬性進行註解,我們也無法對final型別的setSessionfactory方法進行重寫,故而要想把sessionfatory注入就得另外想辦法了。

 

無論何種方法,本質上都是把sessionfactory賦給HibernateDaoSupprot中的sessionfactory,只有這樣我們才能任意的使用HibernateDaoSupport中的任何方法。

 

第一個方法:通過@Resouce--按名字注入(@Autowired--按型別注入)注入,並執行方法體內容

HibernateDaoSupprot中的方法型別為final

 

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

相關文章