快速业务通道

Spring中单例bean访问非单例bean的第一种方式:方法注入 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Spring中单例bean访问非单例bean的第一种方式:方法注入

时间:2011-06-11 未知 zhu国辉

方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保 护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象。

方法注入的最好用途之一就是处理单态、无状态对象需要调用非单态、有状 态或者非线程安全对象的情况。

以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单 例bean 的singleton设置为false就可以了。其实不然,大家想,我们创建了一 个单例对象,在此单例对象中所用到的其它bean也只会创建一次——(大多数情 况是这样的,当然我们要解决的就是这个问题)。所以说,单纯的把非单例bean 的属性singleton设为false是解决不了的。此时就是方法注入大显身手的时候了 。

下面的例子是单例调用单例的情况:我们在service层调用DAO层

/** *@authorzhu国辉 */ packagecom.zgh.spring.dao; importjava.util.List; importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;< BR> /** *记住一定要引入org.springframework.orm. (hibernate3).support.HibernateDaoSupport *也就是此类的父类. *@authorzhu国辉 * */ publicclassUserLoginDaoextendsHibernateDaoSupportimplementsIUserLoginD ao{    inti=0;    publicListgetUser(Stringusername,Stringpassword){      System.out.println("i="+(++i));      System.out.println(username+":"+password);      Listusers=getHibernateTemplate().find ("fromUseruwhereusername=?andpassword=?",newObject[] {username,password});      returnusers;    } }

为了查看效果,我们在DAO中声明了一个成员变量(变成有状态bean)

下面是Service层:

/** *@authorzhu国辉 */ packagecom.zgh.spring.service; importjava.util.List; importcom.zgh.spring.dao.IUserLoginDao;; publicclassUserLoginServiceimplementsIUserLoginService{    privateIUserLoginDaouserLoginDao;    publicvoidsetUserLoginDao(IUserLoginDaouserLoginDao){      this.userLoginDao=userLoginDao;    }    publicListgetUser(Stringusername,Stringpassword){      returnuserLoginDao.getUser(username,password);    } }

Spring中单例bean访问非单例bean的第一种方式:方法注入(2)

时间:2011-06-11 未知 zhu国辉

这是最基本的形式了,单例调用单例,每次程序运行时,DAO里的i都会+1, Spring的配置文件如下:

<!--====================DAO=======================-- >    <beanid="userLoginDao"class="com.zgh.spring.dao.UserLoginDao">      <propertyname="sessionFactory">        <reflocal="mySessionFactory"/>      </property>    </bean>    <!--====================Service=======================-->    <beanid="userLoginService"class="com.zgh.spring.service.UserLoginSe rvice">      <propertyname="userLoginDao">        <reflocal="userLoginDao"/>      </property>    </bean>

那么我们简单的把userLoginDao中添加属性singleton="false",如下:

<beanid="userLoginDao"class="com.zgh.spring.dao.UserLoginD ao"singleton="false">      <propertyname="sessionFactory">        <reflocal="mySessionFactory"/>      </property>    </bean>

我们再运行,i打印出来的还是每被访问一次就+1,也就是说只靠 singleton="false"是不行的,下面我们进行正题:

我们选修改一下 Service:

/** *@authorzhu国辉 */ packagecom.zgh.spring.service; importjava.util.List; importcom.zgh.spring.dao.IUserLoginDao;; publicabstractclassUserLoginServiceimplementsIUserLoginService{    protectedabstractIUserLoginDaogetUserLoginDao();    publicListgetUser(Stringusername,Stringpassword){      returngetUserLoginDao().getUser(username,password);    } }

看看我们都做了什么事:把类声明成abstract,定义一个抽象方法: getUserLoginDao();在使用IUserLoginDao的地方直接使用getUserLoginDao()方 法。DAO层没有什么变化,下面看一下XML配置文件:

<!--====================DAO=======================-- >    <beanid="userLoginDao"class="com.zgh.spring.dao.UserLoginDao"single ton="false">      <propertyname="sessionFactory">        <reflocal="mySessionFactory"/>      </property>    </bean>    <!--====================Service=======================-->    <beanid="userLoginService"class="com.zgh.spring.service.UserLoginSe rvice">      <lookup-methodname="getUserLoginDao"bean="userLoginDao"/>    </bean>

大功告成:运行结果看看,第次i打印的结果都是1,也就是说每次都生成了 新的UserLoginDao实例。在最后的这个XML中,我们先把DAO的属性singleton设 置为false,然后在Service中用<lookup-method>配置他的依赖,name指 定类中的抽象方法,bean指定要注入的类。如此而以。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号