Spring系列文章:Bean的作⽤域

2023-09-15 14:10:33

1、singleton

默认情况下,Spring的IoC容器创建的Bean对象是单例的 

<?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="user" class="com.springcode.example.entity.User"/>

</beans>

测试

public class SpringTest {
    @Test
    public void testInsert(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("user", User.class);
        System.out.println(user);
        User user1 = applicationContext.getBean("user", User.class);
        System.out.println(user1);
    }
}

结果

通过测试得知可以看到Spring的IoC容器中,默认情况下,Bean对象是单例的。

这个对象在什么时候创建的呢?可以为SpringBean提供⼀个⽆参数构造⽅法,测试⼀下,如下:

public class User {
    public User(){
        System.out.println("无参构造执行");
    }
}

测试

public class SpringTest {
    @Test
    public void testInsert(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    }
}

 

通过测试得知,默认情况下,Bean对象的创建是在初始化Spring上下⽂的时候就完成的

2、prototype

如果想让Spring的Bean对象以多例的形式存在,可以在bean标签中指定scope属性的值为: prototype,这样Spring会在每⼀次执⾏getBean()⽅法的时候创建Bean对象,调⽤⼏次则创建⼏次。

<?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="user" class="com.springcode.example.entity.User" scope="prototype"/>

</beans>

 测试

我们可以把测试代码中的getBean()⽅法所在⾏代码注释掉:并且user增加无参构造方法

可以看到这⼀次在初始化Spring上下⽂的时候,并没有创建Bean对象。

scope如果没有配置,它的默认值是什么呢?默认值是singleton,单例的。

 3、其它scope

scope属性的值不⽌两个,它⼀共包括8个选项:

  1. singleton:默认的,单例。
  2. prototype:原型。每调⽤⼀次getBean()⽅法则获取⼀个新的Bean对象。或每次注⼊的时候都是新 对象。
  3. request:⼀个请求对应⼀个Bean。仅限于在WEB应⽤中使⽤。
  4. session:⼀个会话对应⼀个Bean。仅限于在WEB应⽤中使⽤。
  5. global session:portlet应⽤中专⽤的。如果在Servlet的WEB应⽤中使⽤global session的话,和 session⼀个效果。(portlet和servlet都是规范。servlet运⾏在servlet容器中,例如Tomcat。 portlet运⾏在portlet容器中。)
  6. application:⼀个应⽤对应⼀个Bean。仅限于在WEB应⽤中使⽤。
  7. websocket:⼀个websocket⽣命周期对应⼀个Bean。仅限于在WEB应⽤中使⽤。
  8. ⾃定义scope:很少使⽤。

4、⾃定义Scope

接下来咱们⾃定义⼀个Scope,线程级别的Scope,在同⼀个线程中,获取的Bean都是同⼀个。跨线程 则是不同的对象:(以下内容作为了解)

第⼀步:实现Scope接⼝

spring内置了线程范围的类:org.springframework.context.support.SimpleThreadScope,可 以直接⽤

第⼆步:将⾃定义的Scope注册到Spring容器中

    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="myThread">
                    <bean class="org.springframework.context.support.SimpleThreadScope"/>
                </entry>
            </map>
        </property>
    </bean>

第三步:使⽤Scope

<bean id="user" class="com.springcode.example.entity.User" scope="myThread"/>

测试

public class SpringTest {
    @Test
    public void testInsert(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("user", User.class);
        User user1 = applicationContext.getBean("user", User.class);

        System.out.println(user);
        System.out.println(user1);

        // 启动线程
        new Thread(()->{
            User usera = applicationContext.getBean("user", User.class);
            User userb = applicationContext.getBean("user", User.class);
            System.out.println(usera);
            System.out.println(userb);
        }).start();
    }
}

结果

更多推荐

基于 MATLAB 的电力系统动态分析研究【IEEE9、IEEE68系节点】

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果2.1IEEE9节点2.2IEEE68节点🎉3参考文献🌈4Matlab代码、数据、文章💥1概述

什么是云计算中的资源调度,解释资源调度的挑战和算法

1、什么是云计算中的资源调度,解释资源调度的挑战和算法。在云计算中,资源调度(ResourceScheduling)指的是如何在不同类型的资源(例如计算资源、存储资源、网络资源等)之间合理地分配和调度资源,以实现高效的资源管理和任务执行。资源调度的目标是提高系统的可用性、可靠性和性能。然而,资源调度面临着一些挑战。首先

敏捷开发工具:提升软件研发效率的重要利器

在当今的软件开发领域,敏捷开发方法越来越受到推崇。敏捷开发的核心是灵活应对需求变化,以快速迭代的方式不断优化产品。为了助力敏捷开发的实施,各种敏捷开发工具应运而生。本文将介绍几种常用的敏捷开发工具,阐述其特点、应用场景及优缺点,最后对敏捷开发工具的重要性进行总结。一、敏捷开发工具介绍Leangoo领歌:Leangoo领

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是Selenium吗?你知道为什么要使用它吗?答案就在本文中,很高兴能够与你共飧。自动化测试正席卷全球,Selenium认证是业界最抢手的技能之一。什么是Selenium?Selenium是一种开源工具,用于在Web浏览器上执行自动化测试(使用任何Web浏览器进行Web应用程序测试)。等等,先别激动,让我再次

【详细图文】Windows下安装RustRover和配置Rust环境

前言Rust已经火了挺长时间了,连微软的Windows内核都用它来重新改写,可想而知其厉害之处。之前有看过Rust的教程,但一直没有去尝试。今天看到JetBrains出了Rust专用的IDE:RustRover。作为JetBrains的粉丝,决定进行一次部署实践。本文是从工具安装和环境部署到HelloWorld,作为一

kubernetes popeye 巡检

文章目录1.简介2.安装3.本地4.容器1.简介Popeye是一个实用程序,可以扫描实时Kubernetes集群,并报告部署的资源和配置的潜在问题。它根据部署的内容而不是磁盘上的内容来清理集群。通过扫描您的集群,它可以检测错误配置,并帮助您确保最佳实践到位,从而防止未来的麻烦。它旨在减少在野外操作Kubernetes集

搭建Android自动化python+appium环境

一.需要软件JDK:JAVA安装后配置JDK环境SDK:SDK下载后配置adb环境Python:pyhton语言Pycharm:python脚本编译工具Appium-python-client:pyhton中的库Appium客户端二.搭建步骤1.配置JDK环境①.下载安装java:https://www.oracle.

解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制

一、引言癌症是全球范围内健康领域的一大挑战,早期预测和诊断对于提高治疗效果和生存率至关重要。机器学习在癌症预测中发挥了重要作用,可以从临床数据中学习并构建癌症预测模型,帮助医生进行早期检测和干预,提高患者的生活质量和预后结果。然而,机器学习模型的黑盒性质限制了其在临床实践中的应用。可解释的机器学习被广泛关注,它不仅能够

selenium+python实现基本自动化测试

安装selenium打开命令控制符输入:pipinstall-Uselenium火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能SeleniumIDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能,IDE录制的脚本可以可以转换成多种语言,从而帮助我

蓝桥杯 题库 简单 每日十题 day5

01字符计数字符计数题目描述给定一个单词,请计算这个单词中有多少个元音字母,多少个辅音字母。元音字母包括a,e,i,o,u,共五个,其他均为辅音字母。输入描述输入格式:输入一行,包含一个单词,单词中只包含小写英文字母。单词中的字母个数不超过100。输出描述输出两行,第一行包含一个整数,表示元音字母的数量。第二行包含一个

【运维 Pro】时序场景实践与原理 - 2. 宽表,窄表与 JSON 字段

【运维Pro】:由YMatrix售前和售后团队负责的栏目。除了介绍日常的数据库运维和使用知识,我们更希望能够通过介绍这些知识背后的原理,让大家和我们一起感知数据库的美妙。摘要在上一期《时序场景实践与原理-1.分布与分区》中,我们围绕时间戳和设备标识列,介绍了设计关于分区、分布的设计思路和原理;在本期内容中,我们会围绕指

热文推荐