有状态会话bean   :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话bean   :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean   的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean   并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的

到底用singleton 还是 prototype?

到底改用哪个scope?这决定于你所注入的对象是否包含状态。

比较适合用单例模式的就是dao/service,因为他们不包含变化的成员变量,方法调用不会改变这个对象的状态(它也没有状态可言),如下面这个类

只有一个成员变量sessionFactory,而该变量是由spring注入的,全局也只有一个,可以看成是BaseDaoImpl的一个静态变量,不存在状态变化。因此下面的类比较适合用singleton。

  1. @Repository("baseDao")

  2. public class BaseDaoImpl<T> implements BaseDaoI<T> {

  3. private SessionFactory sessionFactory;

  4. public SessionFactory getSessionFactory() {

  5. return sessionFactory;

  6. }

  7. @Autowired

  8. public void setSessionFactory(SessionFactory sessionFactory) {

  9. this.sessionFactory = sessionFactory;

  10. }

  11. public Serializable save(T o) {

  12. return sessionFactory.getCurrentSession().save(o);

  13. }

  14. public void delete(T o) {

  15. sessionFactory.getCurrentSession().delete(o);

  16. }

  17. public void update(T o) {

  18. sessionFactory.getCurrentSession().update(o);

  19. }

  20. public void saveOrUpdate(T o) {

  21. sessionFactory.getCurrentSession().saveOrUpdate(o);

  22. }

  23. }

那什么时候用prototype呢?

看下面代码

  1. public class UserAction extends BaseAction implements ModelDriven<UserDTO> {

  2. private static final long serialVersionUID = 1L;

  3. private UserDTO userDTO = new UserDTO();

  4. private UserServiceI userService;

  5. public UserDTO getModel() {

  6. return userdto;

  7. }

  8. public UserServiceI getUserService() {

  9. return userService;

  10. }

  11. @Autowired

  12. public void setUserService(UserServiceI userService) {

  13. this.userService = userService;

  14. }

  15. }

这里有一个成员变量比较特殊 userDTO,它是由jsp传递过来并封装成的对象,而不同请求传递的参数又不同,也因此userDTO它是一个可变的变量。当我执行了login的 action 那么userDTO中便是login的用户信息,如果执行了register的action那么userDTO中便是注册的信息。假如我声明userAction为singleton会发生什么呢。我先执行注册,注册后这个userDTO被赋值,其值包含了用户注册的username,pwd,email,birthday等信息,并且该对象不会被销毁,之后我又执行了login的action,那么在login action中得到的userDTO对象中就包含了email,birthday等信息--这是我们不希望看到的。那么下次使用userAction时便又携带了上次执行后存在的状态。因此,用完userAction后必须销毁,然后由Spring容器再生成一个新的实例。这就是为什么要用prototype而不是singleton的理由了

Spring中原型prototype相关推荐

  1. 在spring中,prototype scoped bean 如何注入单例bean中

    2019独角兽企业重金招聘Python工程师标准>>> 参考博文:http://www.javacodegeeks.com/2012/08/spring-scoped-proxy.h ...

  2. 学习笔记【Spring中常用的设计模式】

    文章目录 简介 一. Spring用到的设计模式类别 1. 创建型模式 2. 结构性模式 3. 行为型模式 二. 设计模式详解 1. 工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 1.3 抽象 ...

  3. SPRING中属性SCOPE的prototype是什么意思

    SPRING中属性SCOPE的prototype是什么意思 关键字: spring中属性scope的prototype是什么意思 默认情况下,从bean工厂所取得的实例为Singleton(bean的 ...

  4. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  5. JavaScript中的原型prototype及原型链

    原型prototype 简介: prototype里面放置了一种类的公用的方法(构造函数:constructor)和类的信息.因此可以用来作为一种类的共享数据实现机制.这种共享的另一个好处的是减少了内 ...

  6. 浅谈JavaScript中的原型prototype

    之前看过一些关于原型的知识,但总是看了以后没有及时应用,导致再看到一些代码是遇到还是搞不清楚,借此机会谈一下我对prototype的理解. 1.再谈原型之前,我们要知道什么是构造器函数,型如下例: f ...

  7. Spring 中的bean 是线程安全的吗?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:myseries cnblogs.com/myser ...

  8. Spring中的Controller ,Service,Dao是不是线程安全的?

    作者:myseries cnblogs.com/myseries/p/11729800.html 结论:不是线程安全的 Spring容器中的Bean是否线程安全,容器本身并没有提供Bean的线程安全策 ...

  9. (转)Spring中Singleton模式的线程安全

    不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...

  10. Spring中AOP相关的API及源码解析,原来AOP是这样子的

    前言 之所以写这么一篇文章主要是因为下篇文章将结束Spring启动整个流程的分析,从解析配置到创建对象再到属性注入最后再将创建好的对象初始化成为一个真正意义上的Bean.因为下篇文章会涉及到AOP,所 ...

最新文章

  1. Java日志体系总结
  2. iphone屏蔽系统更新_一招屏蔽系统更新!再见 iOS 13...
  3. 【手写系列】理解数据库连接池底层原理之手写实现
  4. update_notifier 造成nodejs进程数量增长的问题
  5. C++工作笔记-WM_KEYFIRST和WM_KEYDOWN的用法
  6. 基于SkyEye的MPC5554 片上Flash实现
  7. 微信又可以发520红包,还新增情人节“撒狗粮”状态:律师提醒注意
  8. oracle view使用次數,oracle sql资源消耗相关视图
  9. C++ 时间操作(获取毫秒级)【转】
  10. Visual Studio / Thrift C++ 环境配置,编译安装
  11. java中stringBuilder的用法(转)
  12. 什么是核心文件,它们什么时候有用
  13. DDD不够好用,你需要学习如何进行弹性软件系统设计
  14. eversync safari_EverSync app下载-浏览器书签收藏夹同步备份EverSync下载v1.11.1 安卓版-西西软件下载...
  15. dns服务器配置(本地dns,自己当服务器,自己测试自己)
  16. [Python] 一行代码让你明白什么叫艺术
  17. minio操作,文件上传下载
  18. TPAC 2019 小会之 WebCodecs 提案
  19. 互联网信息服务ICP许可证分类是什么?
  20. SSH 连接工具 xshell - 业界最强大的 SSH 客户端、Linux 远程连接工具

热门文章

  1. 苹果向开发者发布iOS/iPadOS 14.6的第二个测试版
  2. 关于苹果Mac上设置固件密码的方法?
  3. FL Studio中钢琴卷帘窗的工具的使用
  4. (十一)JAVA springboot ssm b2b2c多用户商城系统 - SSO单点登录之OAuth2.0登录流程(2)
  5. [ ZJOI 2006 ] Trouble
  6. Kotlin入门到放弃
  7. 自用JavaMail实现
  8. Linux 查看网络速率
  9. 让Office无处不在——Office Web App初体验
  10. DataGridView获得所有选中行的某列的值