目录

基本概念

演示


基本概念

singleton作用域就是单例模式;用spring容器实现单例模式

而prototype作用域可以理解为多例模式!

Singleton作用域例子:

左侧的ref就是右侧bean的id,这里就是把右边的bean通过spring注入到左侧的bean中;

而Singleton是如下的情况:

而Prototype是这样的

演示

如下的文件结构:

Bean1.java

package singleandprodemo.demo;public class Bean1 {private Bean2 bean2;public Bean2 getBean2() {return bean2;}public void setBean2(Bean2 bean2) {this.bean2 = bean2;}@Overridepublic String toString() {return "Bean1{" +"bean2=" + bean2 +'}';}
}

Bean2.java

package singleandprodemo.demo;public class Bean2 {
}

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="singleandprodemo.demo.Bean2" id="bean2" scope="singleton"/><bean class="singleandprodemo.demo.Bean1" id="bean1"><property name="bean2" ref="bean2"/></bean>
</beans>

这里要注意bean1没有填写scope,这里没填的默认是scope为singleton

这里编写如下的运行代码:

    public void contextLoads() {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);}

运行截图如下:

从这里可以知道,单例模式在一个spring上下文环境中,被单例化;

修改如下运行代码:

    public void contextLoads() {ApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context1.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);System.out.println("---------------华丽的分割线---------------");ApplicationContext context2 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_3 = context2.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_3);Bean2 bean2_4 = context2.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_4);Bean1 bean2 = context2.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean2);}

运行截图如下:

可见不同的spring上下文环境中实例的Bean是不一样的;

修改spring.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="singleandprodemo.demo.Bean2" id="bean2" scope="singleton"/><bean class="singleandprodemo.demo.Bean1" id="bean1" scope="prototype"><property name="bean2" ref="bean2"/></bean>
</beans>

运行代码如下:

    public void contextLoads() {ApplicationContext context1 = new ClassPathXmlApplicationContext("spring.xml");Bean2 bean2_1 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_1 = " + bean2_1);Bean2 bean2_2 = context1.getBean("bean2", Bean2.class);System.out.println("bean2_2 = " + bean2_2);Bean1 bean1 = context1.getBean("bean1", Bean1.class);Bean1 bean11 = context1.getBean("bean1", Bean1.class);System.out.println("bean1 = " + bean1);System.out.println("bean11 = " + bean11);System.out.println(bean1 == bean11);}

运行截图如下:

从这里可以知道,但bean1为prototye的时候,实例化的bean1是不同的,(因为上面的false)

下面给出一张表:

这里如果有这样的一个应用场景:

Bean1是singleton,Bean2是prototype,Bean1依赖Bean2,希望每次调用Bean1的某个方法时,该方法拿到的Bean2都是一个新的实例;

这里使用到了方法注入!!!!!!!!!!!!!!

修改Bean1.java

package singleandprodemo.demo;public abstract class Bean1 {protected abstract Bean2 createBean2();public void printBean2(){System.out.println("bean2 = " + createBean2());}
}

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="singleandprodemo.demo.Bean2" id="bean2" scope="prototype"/><bean class="singleandprodemo.demo.Bean1" id="bean1" scope="prototype"><!-- <property name="bean2" ref="bean2"/> --><lookup-method name="createBean2" bean="bean2"></lookup-method></bean>
</beans>

测试代码如下:

    public void contextLoads() {ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");Bean1 bean1 = context.getBean("bean1", Bean1.class);bean1.printBean2();bean1.printBean2();bean1.printBean2();bean1.printBean2();}

运行截图如下:

Spring中Singleton作用域和Prototype作用域相关推荐

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

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

  2. spring 中属性scope 的prototype(有状态)和singleton(无状态)

    默认情况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例, 默认的配置. Prototype: ...

  3. Spring中bean的五个作用域简介(转载)

    Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型). Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和ses ...

  4. spring中bean的5个作用域

    bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...

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

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

  6. Spring中Singleton模式的线程安全

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

  7. junit依赖_3、Spring 中的依赖注入(DI),你都知道多少?

    0. 前言 Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean.简而言之,Bean 就是由 IoC 容器来进行初始化.装配和管理的对象. Bean 的 ...

  8. 浅谈Spring中JDK动态代理与CGLIB动态代理

    前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...

  9. Spring中的循环依赖解决详解

    目录 1 什么是循环依赖? 1.1 构造器循环依赖 1.2 field属性注入循环依赖 1.3 field属性注入循环依赖(prototype) 2 循环依赖处理 2.1 构造器循环依赖(无法解决) ...

最新文章

  1. 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码
  2. linux命令:grep
  3. HDU 4630 No Pain No Game 树状数组+离线操作
  4. Ubuntu 安装 Docker
  5. FFmpeg转HTML5支持的视频格式
  6. pcl如何设置colorbar_突然加更 | 子图、colorbar和标题
  7. 浮动路由与VRRP的概念
  8. hibernate中查询方式(一):
  9. tp6 实现汉字转拼音
  10. CVPR 2020评审结果放出,魏秀参博士教你如何rebuttal!!!
  11. 使用数字全通滤波器对IIR滤波器进行相位补偿
  12. 提高工作效率的软件推荐
  13. 西安电子科技大学计算机水平,“两电一邮”的西安电子科技大学,在国内高校中,到底什么水平?...
  14. EBS 个性化:个性化简介
  15. 国内科技巨头的区块链布局:BAT多领域布局,迅雷领跑主链
  16. 我用纯C语言开发的中英文混合分词服务器3.0正式发布,词库190多万词,每秒切分5万+,同时提供 c、java、C#、delphi、js调用范例
  17. 美国国土安全部重点努力加强国家关键基础设施的网络安全
  18. 更加简便的使用VSS
  19. 产品经理应该如何打造爆款产品
  20. android图片压缩的三种方式

热门文章

  1. Java华丽转身 —— GUI编程宝典
  2. 哥哥被我打哭了的飞鸽传书
  3. 说干就干的p2psearcher2013
  4. 飞鸽传书2009的“真正价值”
  5. 奇虎回应委员退出360督导委员会 称流氓软件产业链已基本消灭
  6. 全新的企业通讯软件 FreeEIM 2.0
  7. 人人都是程序员的节奏,Python 纳入高考
  8. 《vue2.0基础系列》目录大全,你要的都在这里
  9. 聊聊用于特征处理的tsfresh
  10. macOS Big Sur正式版发布!Big Sur安装失败?更新时卡住了怎么办?