Spring中单例bean访问非单例bean的第一种方式:方法注入(转http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx)
来源:互联网 发布:acm大学生软件大赛 编辑:程序博客网 时间:2024/06/16 03:31
方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象。
方法注入的最好用途之一就是处理单态、无状态对象需要调用非单态、有状态或者非线程安全对象的情况。
以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单例bean 的singleton设置为false就可以了。其实不然,大家想,我们创建了一个单例对象,在此单例对象中所用到的其它bean也只会创建一次——(大多数情况是这样的,当然我们要解决的就是这个问题)。所以说,单纯的把非单例bean的属性singleton设为false是解决不了的。此时就是方法注入大显身手的时候了。
下面的例子是单例调用单例的情况:我们在service层调用DAO层
/**
* @author zhu国辉
*/
package com.zgh.spring.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* 记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
* 也就是此类的父类.
* @author zhu国辉
*
*/
public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao {
int i=0;
public List getUser(String username, String password) {
System.out.println("i="+(++i));
System.out.println(username+":"+password);
List users=getHibernateTemplate().find("from User u where username=? and password=?",new Object[]{username,password});
return users;
}
}
为了查看效果,我们在DAO中声明了一个成员变量(变成有状态bean)
下面是Service层:
/**
* @author zhu国辉
*/
package com.zgh.spring.service;
import java.util.List;
import com.zgh.spring.dao.IUserLoginDao;;
public class UserLoginService implements IUserLoginService {
private IUserLoginDao userLoginDao;
public void setUserLoginDao(IUserLoginDao userLoginDao) {
this.userLoginDao = userLoginDao;
}
public List getUser(String username, String password) {
return userLoginDao.getUser(username, password);
}
}
这是最基本的形式了,单例调用单例,每次程序运行时,DAO里的i都会+1, Spring的配置文件如下:
<!--==================== DAO======================= -->
<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
<!--====================Service======================= -->
<bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
<property name="userLoginDao">
<ref local="userLoginDao"/>
</property>
</bean>
那么我们简单的把userLoginDao中添加属性singleton="false",如下:
<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
我们再运行,i打印出来的还是每被访问一次就+1,也就是说只靠singleton="false"是不行的,下面我们进行正题:
我们选修改一下 Service:
/**
* @author zhu国辉
*/
package com.zgh.spring.service;
import java.util.List;
import com.zgh.spring.dao.IUserLoginDao;;
public abstract class UserLoginService implements IUserLoginService {
protected abstract IUserLoginDao getUserLoginDao();
public List getUser(String username, String password) {
return getUserLoginDao().getUser(username, password);
}
}
看看我们都做了什么事:把类声明成abstract,定义一个抽象方法:getUserLoginDao();在使用IUserLoginDao的地方直接使用getUserLoginDao()方法。DAO层没有什么变化,下面看一下XML配置文件:
<!--==================== DAO======================= -->
<bean id="userLoginDao" class="com.zgh.spring.dao.UserLoginDao" singleton="false">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
<!--====================Service======================= -->
<bean id="userLoginService" class="com.zgh.spring.service.UserLoginService">
<lookup-method name="getUserLoginDao" bean="userLoginDao"/>
</bean>
大功告成:运行结果看看,第次i打印的结果都是1,也就是说每次都生成了新的UserLoginDao实例。在最后的这个XML中,我们先把DAO的属性singleton设置为false,然后在Service中用<lookup-method>配置他的依赖,name指定类中的抽象方法,bean指定要注入的类。如此而以。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx
- Spring中单例bean访问非单例bean的第一种方式:方法注入(转http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx)
- CString 的方法(from:http://blog.csdn.net/lijuwen/archive/2006/03/13/623186.aspx)
- PE文件导入表的代码注入http://blog.csdn.net/xieqidong/archive/2008/05/05/2391338.aspx
- 集合的clone[转自http://blog.csdn.net/dr2tr/archive/2006/03/07/617474.aspx]
- java关键字Transient 转自:http://blog.csdn.net/flynetcn/archive/2008/03/03/2142020.aspx
- 转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx
- 转自:http://blog.csdn.net/jingang123gz/archive/2008/03/02/2141075.aspx
- 验证码识别的基本思路及方法 http://blog.csdn.net/lkfstar/archive/2008/01/12/2039287.aspx
- .net 中viewstate的原理和使用 转 http://blog.csdn.net/greyls/archive/2007/07/08/1682570.aspx
- 程序员的十层楼(http://blog.csdn.net/xjbx/archive/2009/02/08/3869314.aspx)
- 面向对象的程序(http://blog.csdn.net/qi_jianzhou/archive/2006/03/31/646124.aspx)
- Silverlight的开发工具 转http://blog.csdn.net/dotnetwalker/archive/2007/10/24/1841847.aspx
- http://blog.csdn.net/gotoidea/archive/2004/08/03/59894.aspx
- 1个人开发操作系统-初篇 http://blog.csdn.net/tyrone1979/archive/2006/08/03/1013734.aspx
- http://blog.csdn.net/pongba/archive/2008/07/08/2625115.aspx
- http://blog.csdn.net/yanleigis/archive/2008/03/31/2233674.aspx
- setprecision()与setiosflags() (转载http://blog.csdn.net/yunhaiC/archive/2008/03/11/2167462.aspx)
- Qte与Qt(转自http://blog.csdn.net/kevin881/archive/2005/01/03/238772.aspx)
- 上个月的第一天、最后一天等
- VC++6.0中常出现的"unexpected end of file while looking for precompiled header directive"的问题
- 高效程序员应该养成的七个习惯
- 第四章 []运算符的本质
- 使用va_list自定义print的小例子.
- Spring中单例bean访问非单例bean的第一种方式:方法注入(转http://blog.csdn.net/ayueiloveyou/archive/2008/08/03/2760473.aspx)
- 关于IT的我们
- test
- Perl程序设计中常用的函数
- 关于编译与内存的关系,以及执行时内存的划分
- css去掉链接虚线框
- windows 登陆hash值在线破解
- Thinkvd 图标设计样稿
- 模拟路由功能