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

来源:互联网 发布:掌上电脑写卡软件 编辑:程序博客网 时间:2024/06/05 11:02

大部分时候我们都是通过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代码  

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;  }  

解决方法:
Java代码  
@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属性,得到类似注入的结果,可以直接使用超类中的各种方法无碍。那么这第二种方法则是第一种方法两个效果的分开进行。
@Repositorypublic 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(sessionFactory);}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,直接使用其方法。

阅读全文
0 0