- 浏览: 1513844 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
方法注入在Spring中是很少用的,主要应用是, 对象中可能定义了一个受保护的抽象方法,而容器可能在运行时实现他以返回由容器查询得到的对象。
方法注入的最好用途之一就是处理单态、无状态对象需要调用非单态、有状态或者非线程安全对象的情况。
以前刚接触Spring时,如果在单例bean中调用非单例bean,只要把那个非单例bean 的singleton设置为false就可以了。其实不然,大家想,我们创建了一个单例对象,在此单例对象中所用到的其它bean也只会创建一次——(大多数情况是这样的,当然我们要解决的就是这个问题)。所以说,单纯的把非单例bean的属性singleton设为false是解决不了的。此时就是方法注入大显身手的时候了。
下面的例子是单例调用单例的情况:我们在service层调用DAO层
/**
*@authorzhu国辉
*/
package com.zgh.spring.dao;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
*记住一定要引入org.springframework.orm.(hibernate3).support.HibernateDaoSupport
*也就是此类的父类.
*@authorzhu国辉
*
*/
public class UserLoginDao extends HibernateDaoSupport implements IUserLoginDao{
inti=0;
public List getUser(Stringusername,Stringpassword){
System.out.println("i="+(++i));
System.out.println(username+":"+password);
List users=getHibernateTemplate().find("from User u where username=? and password=?",newObject[]{username,password});
return users;
}
}
为了查看效果,我们在DAO中声明了一个成员变量(变成有状态bean)
下面是Service层:
/**
*@authorzhu国辉
*/
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:
/**
*@authorzhu国辉
*/
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指定要注入的类。如此而以。
发表评论
-
Spring Framework 开发参考手册
2011-09-02 16:15 1484http://www.html.org.cn/books/sp ... -
相关知识和链接
2011-09-01 15:21 1265《spring攻略》译员博客http://digitalson ... -
spring简述
2011-08-31 16:25 1269背景 Rod Johnson在2002年编著的《Expert ... -
传智播客_spring_PPT_黎活明
2011-08-05 16:44 0传智播客_spring_PPT_黎活明.ppt -
spring 中的singleton和ClassLoader中的单例
2011-08-03 15:50 2547http://www.iteye.com/topic/7186 ... -
Spring AOP原理及拦截器
2011-07-11 14:25 2189原理AOP(Aspect Oriented Progr ... -
Spring AOP: Spring之面向方面编程
2011-07-11 14:12 6315.1. 概念 ... -
AOP
2011-07-11 14:10 1459What is AOP?AOP即Aspect-Orie ... -
Spring的组件自动扫描机制
2011-07-06 10:06 2428Spring将所有的bean都纳入到IOC中创建、管理和维护。 ... -
Spring技术内幕——深入解析Spring架构与设计原理(五)Spring与远端调用
2011-07-04 10:31 1446http://jiwenke.iteye.com/blog/5 ... -
Spring事物笔记
2011-06-14 23:01 1807/**什么异常时才回滚**/ Spring事务策略由Pl ... -
Spring in Action 学习笔记—第六章 远程调用
2010-12-24 10:09 1820远程调用是客户端应用 ... -
浅谈Spring事务隔离级别
2010-11-02 16:05 1197本文将介绍Spring事务隔 ... -
Spring事务的传播行为和隔离级别
2010-11-02 15:51 1417Spring中事务的定义:一、Propagation : ... -
spring aop 面向切面编程 如何来做一个强大的日志记录功能
2010-07-08 16:11 3605这个东西怎么做:spring aop 面向切面编程 如何来做一 ... -
关于spring声明式事务管理异常处理的测试和小结
2010-07-08 10:51 1351关于spring事务管理以及异常处理的帖子,本论坛争论颇多,各 ... -
Spring源代码解析(一):IOC容器(1)
2010-07-01 11:00 1262ss -
spring ApplicationContext的实现
2010-07-01 10:37 1539spring为ApplicationContext提供的3 ... -
使用web.xml方式加载Spring时,获取Spring context的两种方式:
2010-06-25 14:10 16381、servlet方式加载时: 【web .xml】 ... -
Spring 框架的设计理念与设计模式分析(2)
2010-06-18 09:59 1635如何创建 Bean 实例并构建 Bean 的关系网 下面 ...
相关推荐
在spring中最核心的就是IOC容器,默认采用的是通过单例的模式来进行管理我们注入到Ioc中的bean(当然我们也是可以修改成其他的模式,暂且不讨论),在spring中单例模式是采用注册的方式来实现的单例模式,所以我也是...
这里提到的“验证单例多用构造方法”可能是指 Spring MVC 中单例 Bean 的生命周期问题。Spring 管理的 Bean 默认是单例模式,即在整个应用中只有一个实例。当 Bean 采用构造方法初始化时,无论多少次请求,构造函数...
Spring中单例的概念限于Spring上下文中,遵守约定 内部bean适用于setter注入和构造器注入,内部bean不能被复用 SpEL表达式 3. 高级装配 4 种自动装配 byName, byType, contructor, autodetect 可以在一个应用上下...
Spring 中单例作用范围 - **知识点**: `Spring`中`Singleton`作用范围的概念。 - **选项解析**: - **A**. `Context`: 正确。在`Spring`的上下文中,`Singleton`作用范围意味着每个`ApplicationContext`只有一个...
【02期】你能说说Spring框架中Bean的生命周期吗? 【03期】如何决定使用 HashMap 还是 TreeMap? 【04期】分库分表之后,id 主键如何处理? 【05期】消息队列中,如何保证消息的顺序性? 【06期】单例模式有几种...
在Spring MVC中,我们需要创建一个处理器方法来处理文件上传。创建一个名为`UploadController`的控制器类,并添加一个`@RequestMapping`注解的方法: ```java import org.springframework.stereotype.Controller; ...
标题 "spring+spring mvc +mybatis框架(maven项目)" 描述的是一个基于Java的Web开发项目,它整合了三个主流的开源框架:Spring、Spring MVC和MyBatis。这样的组合在企业级应用中非常常见,因为它提供了完整的控制...