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

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

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

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

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

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.dao;
  5. import java.util.List;
  6. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  7. /**
  8.  * 记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
  9.  * 也就是此类的父类.
  10.  * @author zhu国辉
  11.  *
  12.  */
  13. public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao {
  14.     int i=0;
  15.     public List getUser(String username, String password) {
  16.         System.out.println("i="+(++i));
  17.         System.out.println(username+":"+password);
  18.         List users=getHibernateTemplate().find("from User u where username=? and password=?",new Object[]{username,password});
  19.         return users;
  20.     }
  21. }

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

下面是Service层:

 

 

 

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.service;
  5. import java.util.List;
  6. import com.zgh.spring.dao.IUserLoginDao;;
  7. public class UserLoginService implements IUserLoginService {
  8.     private IUserLoginDao userLoginDao;
  9.     
  10.     public void setUserLoginDao(IUserLoginDao userLoginDao) {
  11.         this.userLoginDao = userLoginDao;
  12.     }
  13.     public List getUser(String username, String password) {
  14.         
  15.         return userLoginDao.getUser(username, password);
  16.     }
  17. }

 

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

  1.     <!--==================== DAO======================= -->
  2.     <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao">
  3.         <property name="sessionFactory">
  4.             <ref local="mySessionFactory"/>
  5.         </property>
  6.     </bean>
  7.     
  8.     <!--====================Service======================= -->
  9.     <bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
  10.         <property name="userLoginDao">
  11.             <ref local="userLoginDao"/>
  12.         </property>
  13.     </bean>

 

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

  1.     <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
  2.         <property name="sessionFactory">
  3.             <ref local="mySessionFactory"/>
  4.         </property>
  5.     </bean>

 

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

我们选修改一下 Service:

  1. /**
  2.  * @author zhu国辉
  3.  */
  4. package com.zgh.spring.service;
  5. import java.util.List;
  6. import com.zgh.spring.dao.IUserLoginDao;;
  7. public abstract class UserLoginService implements IUserLoginService {
  8.     protected abstract IUserLoginDao getUserLoginDao();
  9.     public List getUser(String username, String password) {
  10.         
  11.         return getUserLoginDao().getUser(username, password);
  12.     }
  13. }

 

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

  1.     <!--==================== DAO======================= -->
  2.     <bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
  3.         <property name="sessionFactory">
  4.             <ref local="mySessionFactory"/>
  5.         </property>
  6.     </bean>
  7.     
  8.     <!--====================Service======================= -->
  9.     <bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
  10.         <lookup-method name="getUserLoginDao" bean="userLoginDao"/>
  11.     </bean>

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值