Spring中Singleton作用域和Prototype作用域
目录
基本概念
演示
基本概念
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作用域相关推荐
- SPRING中属性SCOPE的prototype是什么意思
SPRING中属性SCOPE的prototype是什么意思 关键字: spring中属性scope的prototype是什么意思 默认情况下,从bean工厂所取得的实例为Singleton(bean的 ...
- spring 中属性scope 的prototype(有状态)和singleton(无状态)
默认情况下,从bean工厂所取得的实例为Singleton(bean的singleton属性) Singleton: Spring容器只存在一个共享的bean实例, 默认的配置. Prototype: ...
- Spring中bean的五个作用域简介(转载)
Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型). Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和ses ...
- spring中bean的5个作用域
bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...
- (转)Spring中Singleton模式的线程安全
不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...
- Spring中Singleton模式的线程安全
不知道哪里的文章,总结性还是比较好的.但是代码凌乱,有的还没有图.如果找到原文了可以进行替换! spring中的单例 spring中管理的bean实例默认情况下是单例的[sigleton类型],就还有 ...
- junit依赖_3、Spring 中的依赖注入(DI),你都知道多少?
0. 前言 Spring 中,用来组成应用程序的主体以及由 Spring IoC 容器所管理的对象叫做 Bean.简而言之,Bean 就是由 IoC 容器来进行初始化.装配和管理的对象. Bean 的 ...
- 浅谈Spring中JDK动态代理与CGLIB动态代理
前言 Spring是Java程序员基本不可能绕开的一个框架,它的核心思想是IOC(控制反转)和AOP(面向切面编程).在Spring中这两个核心思想都是基于设计模式实现的,IOC思想的实现基于工厂模式 ...
- Spring中的循环依赖解决详解
目录 1 什么是循环依赖? 1.1 构造器循环依赖 1.2 field属性注入循环依赖 1.3 field属性注入循环依赖(prototype) 2 循环依赖处理 2.1 构造器循环依赖(无法解决) ...
最新文章
- 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码
- linux命令:grep
- HDU 4630 No Pain No Game 树状数组+离线操作
- Ubuntu 安装 Docker
- FFmpeg转HTML5支持的视频格式
- pcl如何设置colorbar_突然加更 | 子图、colorbar和标题
- 浮动路由与VRRP的概念
- hibernate中查询方式(一):
- tp6 实现汉字转拼音
- CVPR 2020评审结果放出,魏秀参博士教你如何rebuttal!!!
- 使用数字全通滤波器对IIR滤波器进行相位补偿
- 提高工作效率的软件推荐
- 西安电子科技大学计算机水平,“两电一邮”的西安电子科技大学,在国内高校中,到底什么水平?...
- EBS 个性化:个性化简介
- 国内科技巨头的区块链布局:BAT多领域布局,迅雷领跑主链
- 我用纯C语言开发的中英文混合分词服务器3.0正式发布,词库190多万词,每秒切分5万+,同时提供 c、java、C#、delphi、js调用范例
- 美国国土安全部重点努力加强国家关键基础设施的网络安全
- 更加简便的使用VSS
- 产品经理应该如何打造爆款产品
- android图片压缩的三种方式