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

方法注入在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);
   }
}

时间: 2024-12-26 22:35:14

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

okhttp-单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗?

问题描述 单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗? android 6.0sdk移除了apache的httpclient,volley必须得手动维护cookie,网上有文章说Okhttp支持cookies维护,但我有个疑问,单例Okhttp能像单例httpclient一样不需要我们手动去维护cookie吗?多谢解答 解决方案 最好用httpclient,它比较完备. 解决方案二: HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了

java web-Struts里的action是单例,那这个单例是什么意思?

问题描述 Struts里的action是单例,那这个单例是什么意思? Struts里的action是单例,那这个单例是什么意思?Struts里的action是单例,那这个单例是什么意思? 解决方案 首先action不是单例.这里说的单例,是设计模式里提到的单例模式(singleton),一个程序这个类型只有一个对象实例. 解决方案二: struts 2的Action是多实例的并非单例,也就是每次请求都会产生一个Action的对象.Servlet是单例的,也就是整个应用中每个被请求到的Servle

在.jsp中非表单请求action的几种方式总结_JSP编程

一: 复制代码 代码如下: <a href="userAction.do?flag=user_regist">注册</a> 二: 复制代码 代码如下: <a href="<s:url action="userAction"> <s:param name="flag" value="'user_regist'" /> </s:url>">

spring管理struts2对象,管理成单例对象纠结的问题

问题描述 需求:1>为了满足性能测试需求,不能用struts2原有的多例对象,必须单例对象2>用spring管理struts2对象,而且要单例我就纠结了,不管spring 怎么管理struts2对象都行,非要单例.单例对象怎么能满足大并发量请求的问题?难道spring容器会造struts2对象的副本,有spring容易自动管理内存?从性能测试角度,是单例的好,很省内存.但从大并发请求考虑,我还是觉得struts2原有的方式不错. 解决方案 Spring 自动默认并且推荐也是单例!引用难道spr

java-项目中什么时候用单例什么时候用多例?

问题描述 项目中什么时候用单例什么时候用多例? 在网上看朋友说,action一定要用多例,保证数据安全.那么在项目开发中,通常哪些地方用单例哪些地方用多例呢? 解决方案 单例多例需要搞明白两个问题: 1. 什么是单例多例: 2. 如何产生单例多例: 3. 为什么要用单例多例 4. 什么时候用单例,什么时候用多例: 1. 什么是单例多例: 所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义         单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示:         Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行

spring-一个关于单例和线程的问题

问题描述 一个关于单例和线程的问题 Spring的bean 默认是单例的也就是说每次请求获取的bean都是同一个 验证hashCode也确实是相等的. @Autowired private TestBean testBean; @RequestMapping(""test1.html"") public @ResponseBody String test1() throws InterruptedException { testBean.test(); return

关于Java单例对象同步问题

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息.例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可.这种方式极大地简化了在复杂环境下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步

getInstance有不是单例的情况吗

问题描述 getInstance有不是单例的情况吗 private static DeviceServerHolder instance = null; public static DeviceServerHolder getInstance() { if (instance == null) { instance = new DeviceServerHolder(); } return instance;}我在两个方法里调用getInstance()方法.方法A检测到instance是空,建了