JAVA(Spring)学习笔记---->Scope(作用域)

2023-11-15

这篇文章笔者和大家来聊一聊Spring中的两个标签配置范围,即singleton和prototype,前者意味单例的,后者则是多例的。

Scope取值 实例化个数 实例化时机 对象创建 对象运行 对象销毁
singleton(单例,饿汉式) 1 当Spring文件被加载时,实例话配置的Bean实例(只创建一次 创建容器时,对象向就被创建 容器在对象一直活着 容器销毁对象销毁
prototype(多例,懒汉式) 当调用getBean()方法时实例化Bean(每次从容器中获得Bean时都会创建新的实例) 使用对象时,创建新的实例 对象在使用对象就一直活着 对象长时间不用,对象被销毁

由此可见:作用域在单例模式下,对象和容器密切相连,且对象只创建一次(首次才创建)容器创建,运行,销毁,对象也跟着创建,运行,销毁;

                   作用域在多例模式下,就大不相同,对象在每次获得Bean的情况下会创建新的实例,对象的创建,运行,销毁都与对象是否被使用而挂钩。

以上笔者通过对两个标签 的介绍,接下来我们上代码,通过代码来联系上文,大家才能更好的理解。在笔者的代码中有懒加载的操作,笔者会通过延迟加载和测试类的运行结果来证明两个标签创建的实例。。

singleton单例模式:

笔者这里创建两次单例,第一次不加延迟加载的标签,第二次加入延迟加载的标签,我们来看看有何不同?

创建Eagle类

public class Eagle  {
    
    //属性
    //无参构造和有参构造
    //初始化方法
}
<?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 id="first" class="com.kaifamiao.ioc.scope.Eagle" init-method="init" scope="singleton">
        <constructor-arg name="name" value="fist"/>
    </bean>

    <bean id="second" class="com.kaifamiao.ioc.scope.Eagle" init-method="init" scope="singleton" lazy-init="true">
        <constructor-arg name="name" value="second"/>
    </bean>

</beans>
package com.kaifamiao.ioc.scope;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class singletonTest {

    private static String configs="classpath*:com/**/scope/singleton.xml";
    private static AbstractApplicationContext context;

    public @BeforeClass static void setUp(){

        context = new ClassPathXmlApplicationContext(configs);
        System.err.println( "- ".repeat( 30 ) );
    }

    public @Test void singletonTest1(){

        Eagle a = context.getBean("first", Eagle.class);
        Assert.assertNotNull( a );
        System.out.println(a);

        Eagle b= context.getBean("first", Eagle.class);
        Assert.assertNotNull( b );
        System.out.println(b);

        Assert.assertEquals( a , b );
        Assert.assertTrue( a == b );

    }

    public @Test void singletonTest2(){
        Eagle a = context.getBean("second", Eagle.class);
        Assert.assertNotNull( a );
        System.out.println(a);

        Eagle b = context.getBean("second", Eagle.class);
        Assert.assertNotNull( b );
        System.out.println(b);

        Assert.assertEquals( a , b );
        Assert.assertTrue( a == b );

    }

    public @AfterClass static void tearDown(){
        context.close();
    }
}

第一次我们用的是单例(single)且没有加入延迟加载,结果是:hash值是相同的说明是同一个对象,证明出单例模式下就算获得两次Bean也只创建一次对象。

接下来我们加入延迟加载,当 lazy-init 为 true 时为懒汉式,容器初始化时并不会 完成对该 bean 的实例化和初始化,首次从容器获取时才完成实例化和初始化。这里的首次和第二次我们看作当bean="second"时,测试类中的测试方法中testSingleton2创建的两个second.

 这一次我们在单例模式下,加入了延迟加载,运行结果中两个hash值也是一样的,这说明什么?说明了在在延迟加载的情况下,第一个second的创建后是首次创建,对象创建一次,加入延迟加载,延迟的是什么?延迟的是第二个Bean的调用,但是因为单例模式下,对象只首次创建,第二次就不在创建了。

笔者希望大家能把单例模式下的两种理解清楚,那么多例就更容易理解了。接下来我们说一说,多例模式下的加入延迟加载又什么不同?

prototype多例模式:

老样子,笔者这里创建两次多例,第一次不加延迟加载的标签,第二次加入延迟加载的标签,我们来看看有何不同?

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:c="http://www.springframework.org/schema/c"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="first" class="com.kaifamiao.ioc.scope.Eagle" scope="prototype" init-method="init">
        <constructor-arg name="name" value="first"/>
    </bean>

    <bean id="second" class="com.kaifamiao.ioc.scope.Eagle" scope="prototype" init-method="init" lazy-init="true">
        <constructor-arg name="name" value="second"/>
    </bean>
</beans>
package com.kaifamiao.ioc.scope;

import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 后来的老李
 * @version 1.0
 */
public class prototypeTest {

    private static String configs="classpath*:com/**/scope/prototype.xml";
    private static AbstractApplicationContext context;

    public @BeforeClass static void setUp(){

        context = new ClassPathXmlApplicationContext(configs);
        System.out.println("-".repeat(30));
    }

    public @Test void prototypeTest1(){
        Eagle a = context.getBean("first", Eagle.class);
        Assert.assertNotNull(a);
        System.out.println(a.hashCode());

        Eagle b = context.getBean("first", Eagle.class);
        Assert.assertNotNull(b);
        System.out.println(b.hashCode());


    }

    public @Test void prototypeTest2(){
        Eagle a = context.getBean("second", Eagle.class);
        Assert.assertNotNull(a);
        System.out.println(a.hashCode());

        Eagle b = context.getBean("second", Eagle.class);
        Assert.assertNotNull(b);
        System.out.println(b.hashCode());

    }
    public @AfterClass static void tearDown(){
        context.close();
    }
}

这一次我们在多例模式下没有加入延迟加载,当测试类两次调用Bean创建的对象的hash值不一样,这说明什么?在多例模式下,容器每次从容器中创建都会创建新的实例并初始化。

接下来我们再来看看,多例模式下,加入延迟加载结果又会有什么不同?

 这次是在多例模式下,加入延迟加载,但是结果依然不同,为什么?我们就可以用多例模式下每次获得bean,都会创建的新的实例,既然每次都会创建新的实例,那么是不是就相当于每次都是第一次,每次都是新的,每次都不同,那么延迟加载是不是就对多例没有意义了呢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA(Spring)学习笔记---->Scope(作用域) 的相关文章

  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • 学习之笔记

    Hook技术被广泛应用于安全的多个领域 比如杀毒软件的主动防御功能 涉及到对一些敏感API的监控 就需要对这些API进行Hook 窃取密码的木马病毒 为了接收键盘的输入 需要Hook键盘消息 甚至是Windows系统及一些应用程序 在打补丁
  • Matlab求解矩阵方程

    描述 使用matlab求解某个方程 方程里面的变量和参数都是矩阵形式 代码 clc clear syms x A eye 4 B eye 4 x solve A x inv A B x就是方程的解 下面是另外一种形式 和上面是等同的 cle
  • UE4学习日记——蓝图中的各种颜色代表什么

    节点类型颜色 白色 执行线 蓝色 调用的函数或事件 暗蓝色 结构体 草绿色 流程切换 绿色 纯函数 通常用于获取什么 青色 试着对象转换 紫色 函数定义 灰色 宏 红色 事件的定义 土黄色 时间轴 数据类型颜色 白色线条 执行线 程序的执行
  • XSL-FO 基础知识(三)

    基本块格式化 第 1 页 共4 页 既然您已经接触到了
  • Echarts 提示内容自定义 y轴显示中文

    提示信息 只需要重写tooltip中的formatter方法 然后按照函数进行数据处理 并返回要显示的数据即可 tooltip formatter function params var res params 0 name br 水质等级为
  • html是用来表示网上信息的符号标记语言,html标记的一般格式

    html标记的一般格式 HTML是 Hyper Text Markup Language 超文本标记语言 的缩写 用来表示网上信息的 符号标记语言 是Web文档的规范 也有人把HTML称为浏览器的母语 HTML语言内容丰富 从功能上大体可分
  • Unity 实现AR脱卡功能

    准备好普通的AR东西后 在DefaultTrackableEventHandler代码中的OnTrackingFound 函数中 第一行添加 TrackerManager Instance GetTracker Stop TrackerMa
  • Python面试准备_排序算法

    最常问的Python排序算法 1 冒泡排序 核心算法 选取每个元素 依次跟右边的元素比较 def my sort arr if not isinstance arr list return None i控制比较多少轮 最后1个元素可以不比
  • qtcpsocket调用write和read函数写数据乱码问题解决方法

    参考以下博客QTcpSocket通信乱码解决方法 http blog csdn net zouhao619 article details 7100752 qtcpsocket写中文会乱码 在写入前和读出后进行处理一下就可以正常显示 如先调
  • etcd键值操作

    etcd 删除键值 1 查询所有键值 curl http 10 0 2 255 9001 v2 keys services recursive true 2 删除键值 curl http 10 0 22 39 9001 v2 keys ke
  • 在 Win10 中加快微软账户登录速度的解决方案

    修改DNS即可
  • 2022年中职组网络安全国赛A模块解析第二套

    2022年全国职业院校技能大赛 中职组 网络安全竞赛试题 2 总分100分 赛题说明 一 竞赛项目简介 网络安全 竞赛共分A 基础设施设置与安全加固 B 网络安全事件响应 数字取证调查和应用安全 C CTF夺旗 攻击 D CTF夺旗 防御等
  • Unix_Linux_AIX_常用命令总结

    目录 Java常用知识总结 前言 常用链接 Shell 自动化 处理相关 需要使用到的命令 编码思想 编码规范 shell脚本 循环处理 1 循环小火车 2 循环cup性能 各种命令 0 cd 1 uname 2 ifconfig 3 wh
  • PHP入门-PHP OOP类的继承(构造函数;public、protected和private;self、parent、final )

    0x00 写在前面 从零学习php 最终目的实现代码审计入门 软件采用sublime text 环境使用phpstudy搭建 需要有简单的html基础和php基础 跟随流沙前辈视频学习记录 OOP编程即面对对象编程 本篇学习面向对象中的继承
  • STM32(一)STM32简介

    一 什么是STM32 意法半导体 ST 集团于1988年6月成立 是由意大利的SGS微电子公司和法国Thomson半导体公司合并而成 1998年5月 SGS THOMSON Microelectronics将公司名称改为意法半导体有限公司
  • Linux下的硬件驱动——USB设备(上)(驱动配置部分)

    USB设备越来越多 而Linux在硬件配置上仍然没有做到完全即插即用 对于Linux怎样配置和使用他们 也越来越成为困扰我们的一大问题 本文着力从Linux系统下设备驱动的架构 去阐述怎样去使用和配置以及怎样编制USB设备驱动 对于一般用户
  • python程序基本格式

    缩进风格 恰当的空格 缩进问题 逻辑行首的空白 空格和制表符 用来决定逻辑行的缩进层次 从而用来决定语句的分组 语句从新行的第一列开始 缩进风格统一 每个缩进层次使用 单个制表符 或四个空格 IDE会自动将制表符设置成4个空格 Python
  • 软件测试过程

    目录 软件测试过程模型 计划和控制 测试计划 分析与设计 实现与执行 评估与报告 结束活动 标准的测试流程包括 计划与控制 分析与设计 实现与执行 评估与报告和结束活动 实际测试过程中分为 测试计划 测试方案 测试用例 测试执行 测试报告五
  • 用VS Code搞Qt6:编译源代码与基本配置

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • JAVA(Spring)学习笔记---->Scope(作用域)

    这篇文章笔者和大家来聊一聊Spring中的两个标签配置范围 即singleton和prototype 前者意味单例的 后者则是多例的 Scope取值 实例化个数 实例化时机 对象创建 对象运行 对象销毁 singleton 单例 饿汉式 1