我的编程空间,编程开发者的网络收藏夹
学习永远不晚

spring单例如何改多例

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

spring单例如何改多例

spring单例改多例

单例:就像你一生只有一个老婆。也就是对象始终是同一个。

多例:就像你一生有好多个老婆。也就是对象每次都是新的。

spring默认是单例模式(就每个请求都是用的同一对象,对于dao层肯定是棒棒的),但是有的时候,我们需要每个请求都

产生一个新的对象,就如做微信小程序,用scoket、不可能一直都用一个来接收的,因为需要分配房间,所以需要使用到多例。

对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;

而对于STRUTS1来说,action则可用单例,因为请求参数的值是放在actionForm中,而非action中的;

配置某个类为多例:

<bean id="user" class="modle.User" scope="prototype">  </bean>

但是比如service配置的是多例、dao又是单例,那肯定不行了,因为不能自动注入。

所以需要获得一个新的dao实例,但是手动new的都不可以,那么就借助通过实现 BeanFactoryAware 接口来获得factory

附加自己待测试

public class userService implements BeanFactoryAware{   
  private UserDao userDao;
  private BeanFactory factory;
  public void userService (){
    this.userDao= (UserDao)factory.getBean("userDao");
    userDao.work();
  }
  public UserDao getUserDao() {
        return userDao;
  }
public void setBeanFactory(BeanFactory f) throws BeansException {
    factory = f;
  }
 
}

spring单例、多例使用方法

今天聊聊单例和多例。只想看spring管理的实例有哪些模式,直接看最后。

相信大部分使用java 做web开发的开发人员都用过spring。spring功能最基础功能就是IoC(Inversion of control——控制反转)、AOP(Aspect Oriented Programming——面向切面编程)。其中IoC核心是DI(Dependency injection——依赖注入)。

我们最开始写项目自然而然的是没有框架,生写!但代码多了之后,发现有很多代码,可以抽成公共方法。有些又可以抽成一个类。而有些类又是贯穿整个项目生命周期始终的,而且往往这些类的初始化方法很复杂且重要。那怎么办,总不能每次使用的时候初始化一遍吧,这样很耗编码时间不说,还很占用计算机性能。于是,工厂模式应运而生。通过工厂模式获取各个重要的实例对象。这样就带来一个问题,怎样保证实例只创建一次呢?单例模式应运而生。于是,我们常用的框架spring就成了。

然而需求的发展往往不是单一技术能很好解决的。单例、依赖注入固然好。但是也让我们的开发模式陷入一种定式。即controller、service、dao这样虽然是快速规范的划分,但是往往一些复杂的逻辑只在service或者controller中写会有大量的私有方法、或者一个方法几百上千行。整个业务操作的生命周期局限在一个方法内。并不能好好利用面向对象的思想,写到最后完全就是面向过程编程。一旦逻辑复杂,那方法写的简直惨不忍睹,而且局限于方法的生命周期,很多参数可能会多次调用数据库查同一个数据。那么有什么办法能改变这个局面呢?历史总会给我们答案。

自新世纪之初提出“领域驱动设计”(DDD)以来,这玩意一直不受重视,不仅玄之又玄的理论很少有人去专研,而且所谓“敏捷开发”的盛行,也不适合DDD。但这里并不介绍DDD,说一说DDD的充血模型要在传统数据驱动的业务中使用将面临的首要问题——单例如何注入进充血模型。

比如,我有个User对象,而对象的保存查询操作是与数据库操作。我并不想让User是一个干瘪的值对象,而是让他具备行为,是一个真正有血有肉的充血模型。那么saveUser(User)这样的方法就不再由Dao提供,而是应该由user.save()替代。熟悉JPA的同学肯定想到了。jpa支持对象操作替代传统的repository操作。例如典型的user中的List<Role> roles属性作为关联查询的属性。如果设置级联查询为懒加载,那么jpa只在调用user.getRoles()方法执行的时候发送sql查询对应的role。这是因为jpa代理了user实体对象,而且这也有个问题。如果被jpa代理的对象调用toString()方法,获取roles属性打印时会触发jpa操作。但这时可能已经不属于jpa Entity的生命周期了。踩过坑的朋友肯定遇到过打印日志报了莫名的jpa异常,百思不得其解吧。

况且我们想要的不只是这些。我们可能有些其他的被sqring单例管理的对象方法需要在不同的实例对象中使用。例如:user想要发送数据到远程。那么user.send()可就不归jpa管了。此时如果要想让user能做这个事情必然只能通过spring上下文获取被spring管理的类。聪明的小伙肯定想到了。我让user也被spring管理起来,不就可以注入了吗?是的,但是一旦被spring管理默认就是单例的。总不能每个user都是同一个吧。其实spring可以设置多例的,只是用的人很少。在加有@componet之类注解(@service、@bean...等)受spring管理的类上再加上注解@scope(“prototype”)那么被spring管理的类就是多例的。稍微麻烦点的是,要想获取多例必须通过spring上下文获取。如果直接注入,那么注入的user还是只是那一个。相信各位一定都看过@scope(“prototype”)这种写法吧。但spring其实提供了常量,@scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE),常量可以防止写错那长串单词。有了多例,我们有血有肉的User对象写起来就方便了许多。

为什么我们要这么做呢?“把权力关进笼子”,这句话在编程界就是强类型、常量、枚举这些来体现的。同样,DDD也是把权力锁进领域对象。避免随心所欲的service、随心所欲的repository导致代码后期维护成为爬“屎山”。

spring支持的模式

1.ConfigurableBeanFactory.SCOPE_SINGLETON——单例

2.ConfigurableBeanFactory.SCOPE_PROTOTYPE——多例

扩展模式

3.WebApplicationContext.SCOPE_APPLICATION

4.WebApplicationContext.SCOPE_GLOBAL_SESSION

5.WebApplicationContext.SCOPE_SESSION

6.WebApplicationContext.SOCPE_REQUEST

以上扩展模式看名字都能明白不做多介绍了。希望能给大家一个参考,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

spring单例如何改多例

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring中Bean的单例和多例如何使用

本篇内容主要讲解“Spring中Bean的单例和多例如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中Bean的单例和多例如何使用”吧!Bean的单例和多例使用在Spring中
2023-07-02

spring的单例模式如何现实

在Spring中,有多种方式来实现单例模式:默认的单例模式:Spring容器默认情况下会将所有声明为Bean的对象作为单例对象进行管理。当一个Bean被声明为单例时,在容器启动阶段会创建该Bean的实例,并且将该实例放入Spring容器的B
spring的单例模式如何现实
2024-02-29

spring默认是单例吗

这篇文章将为大家详细讲解有关spring默认是单例吗,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Bean默认的是单例的.如果不想单例需要如下配置:
2023-06-03

spring中怎么向一个单例bean中注入非单例bean

这篇文章主要介绍“spring中怎么向一个单例bean中注入非单例bean”,在日常操作中,相信很多人在spring中怎么向一个单例bean中注入非单例bean问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”s
2023-06-20

php如何实现单例

这篇文章主要介绍了php如何实现单例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php能实现单例,其实现一个单例的方法:1、申请一个私有的静态成员变量来保存该类的唯一实例;
2023-06-14

Java中的多线程如何实现单例模式

这期内容当中小编将会给大家带来有关Java中的多线程如何实现单例模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java多线程中的单例模式一、在多线程环境下创建单例方式一:package com.iet
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录