【Spring6】| Bean的作用域

news2024/11/26 18:29:11

目录

一:Bean的作用域

1. singleton(单例)

2. prototype(多例)

3. 其它scope

4. 自定义scop(了解)


一:Bean的作用域

1. singleton(单例)

(1)默认情况下,Spring的IoC容器创建的Bean对象是单例的(singleton)!

在Spring上下文对象初始化的时候实例化!

SpringBean类

package com.bjpowernode.spring6.bean;

public class SpringBean {
}

spring-scop.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 id="springBean" class="com.bjpowernode.spring6.bean.SpringBean"/>
</beans>

测试程序

package com.bjpowernode.spring6.test;

import com.bjpowernode.spring6.bean.SpringBean;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringScopTest {
    @Test
    public void testScop(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scop.xml");
        SpringBean sb1 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(sb1);
        // 访问同一个对象
        SpringBean sb2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(sb2);
    }
}

执行结果:

通过测试验证:Spring的IoC容器中,默认情况下,Bean对象是单例的!

 (2)这个对象在什么时候创建的呢?

可以为SpringBean提供一个无参数构造方法,进行测试:

SpringBean类

package com.bjpowernode.spring6.bean;

public class SpringBean {
    public SpringBean() {
        System.out.println("SpringBean的无参数构造方法执行了!");
    }
}

将测试程序中getBean()所在行代码注释掉

package com.bjpowernode.spring6.test;

import com.bjpowernode.spring6.bean.SpringBean;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringScopTest {
    @Test
    public void testScop(){
        new ClassPathXmlApplicationContext("spring-scop.xml");
    }
}

执行结果:

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

调用getBean方法只是从Map集合当中取出数据!

2. prototype(多例)

(1)那么就要创建多例的怎么办呢?

如果想让Spring的Bean对象以多例的形式存在,可以bean标签中指定scope属性的值为:prototype(原型、多例)!

spring-scop.xml配置

增加了scope属性,目前来说scope属性有两个值:
第一个值:singleton 单例(默认情况下不设置就是单例的)
第二个值: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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="springBean" class="com.bjpowernode.spring6.bean.SpringBean" scope="prototype"/>
</beans>

执行结果:

得到两次创建的内存地址就不一样了,多例!

 (2)此时是什么时候创建对象呢?

在初始化上下文对象时不会创建对象,每一次执行getBean()方法的时候创建Bean对象,调用几次则创建几次!

SpringBean类

package com.bjpowernode.spring6.bean;

public class SpringBean {
    public SpringBean() {
        System.out.println("SpringBean的无参数构造方法执行了!");
    }
}

将测试程序中getBean()所在行代码注释掉

package com.bjpowernode.spring6.test;

import com.bjpowernode.spring6.bean.SpringBean;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringScopTest {
    @Test
    public void testScop(){
        new ClassPathXmlApplicationContext("spring-scop.xml");
    }
}

执行结果:

此时并没有执行构造方法,通过测试验证确实是调用getBean方法的时候创建对象

3. 其它scope

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

singleton:默认的,单例。

prototype:原型。每调用一次getBean()方法则获取一个新的Bean对象,或每次注入的时候都是新对象。

request:一个请求对应一个Bean仅限于在WEB应用中使用

session:一个会话对应一个Bean仅限于在WEB应用中使用

global session:portlet应用中专用的。如果在Servlet的WEB应用中使用global session的话,和session一个效果。(portlet和servlet都是规范。servlet运行在servlet容器中,例如Tomcat。portlet运行在portlet容器中。)

application:一个应用对应一个Bean仅限于在WEB应用中使用。

websocket:一个websocket生命周期对应一个Bean仅限于在WEB应用中使用。

自定义scope:很少使用。

例如:在pom.xml文件当中引入web的框架springmvc

<!--引入web的框架,例如springmvc-->
 <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>6.0.0-M2</version>
</dependency>

此时的scop值就可以使用request和session的值

4. 自定义scop(了解)

接下来自定义一个Scope,线程级别的Scope!

在同一个线程中,获取的Bean都是同一个;如果是跨线程则是不同的对象!

(1)先测试单例模式下开启多线程创建的是几个Bean对象

package com.bjpowernode.spring6.test;

import com.bjpowernode.spring6.bean.SpringBean;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringScopTest {
    @Test
    public void testThradScop(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scop.xml");
        // 主线程
        SpringBean sb1 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(sb1);
        SpringBean sb2 = applicationContext.getBean("springBean", SpringBean.class);
        System.out.println(sb2);

        // 启动一个新的线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                SpringBean sb3 = applicationContext.getBean("springBean", SpringBean.class);
                System.out.println(sb3);
                SpringBean sb4 = applicationContext.getBean("springBean", SpringBean.class);
                System.out.println(sb4);
            }
        }).start();
    }
}

测试结果:单例模式,拿到的都是同一个Bean对象

 

(2)测试自定义scop

第一步:自定义Scope(实现Scope接口)

实际上spring内置了线程范围的类:org.springframework.context.support.SimpleThreadScope,可以直接用!

第二步:将自定义的Scope注册到Spring容器中

注册的时候需要用到自定义范围配置器CustomScopeConfigurer(自定义范围配置器)

 <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="threadScop">
                    <!--这个Scope接口的实现类使用的是Spring框架内置的,也可以自定义。-->
                    <bean class="org.springframework.context.support.SimpleThreadScope"/>
                </entry>
            </map>
        </property>
    </bean>

第三步:使用Scope

<bean id="springBean" class="com.bjpowernode.spring6.bean.SpringBean" scope="threadScop"/>

完整的spring-cope.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">
    <!--先开启自定义范围配置器CustomScopeConfigurer-->
    <bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
        <property name="scopes">
            <map>
                <entry key="threadScop">
                    <!--使用内置的线程类:SimpleThreadScope-->
                    <bean class="org.springframework.context.support.SimpleThreadScope"/>
                </entry>
            </map>
        </property>
    </bean>

    <!--使用上面自动定义的scope-->
    <bean id="springBean" class="com.bjpowernode.spring6.bean.SpringBean" scope="threadScop"/>
</beans>

第四步:执行结果

还是同样的测试代码,可以看出:

对于同一个线程访问的是同一个Bean对象;对于不同的线程访问的是不同的对象!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】TP TN FP FN及IoU的关系

TP&#xff08;True Positives&#xff09;&#xff1a; 真的正样本 【正样本 被正确分为 正样本】TN&#xff08;True Negatives&#xff09;&#xff1a; 真的负样本 【负样本 被正确分为 负样本】FP&#xff08;False Positives&#xff09;&#xff1a; 假的正样本 【负…

我做测试的3次能力飞跃,让我直接进了字节

回顾我从小公司到字节的成长路径&#xff0c;基本上是伴随着“3次能力飞跃”实现的。 第一家入职的时候是一家小公司&#xff0c;当然我也想直接去字节&#xff0c;可惜自己能力不足。 刚开始入行的时候&#xff0c;什么也不懂&#xff0c;就是从最简单的手工测试做起。每天做…

想开发IM集群?先搞懂什么是RPC!

即时通讯网官方技术群和社区里&#xff0c;经常有开发者在纠结怎么开发IM集群&#xff0c;虽然真正的使用人数&#xff0c;可能用个人电脑单机都能支撑。你也许会说&#xff0c;明明不需要用到IM集群&#xff0c;干吗要自找麻烦&#xff1f;答曰&#xff1a;“老板说这个得有&a…

I.MX6ULL内核开发0:linux内核模块

目录 简要 一、内核模块的概念 二、内核模块加载、卸载过程 简要 1、内核模块的概念 2、内核模块的原理&#xff1a;内核模块在内核的加载、卸载过程。 一、内核模块的概念 内核&#xff0c;是一个操作系统的核心。是基于硬件的第一层软件扩充&#xff0c;提供操作系统的最…

Prim和Kruskal的区别?哪个好?

Prim和Kruskal有啥区别&#xff1f;到底哪个好&#xff1f; 今天做了一道最小生成树的题&#xff0c;发现了一点猫腻&#xff01; 题目在这里 &#xff1a; 《修路问题1》 文章目录Prim和Kruskal有啥区别&#xff1f;到底哪个好&#xff1f;先说结论PrimKruskal修路问题1——…

EPICS Phoebus手册1

1、介绍 Phoebus是一个控制系统Stdio工具集的更新&#xff0c;它移除了对Eclipse RCP和SWT的依赖。 虽然Eclipse RCP快速启动了原先的CS-Studio的实现&#xff0c;并且为CS-Stdio也提供了大约十年的服务&#xff0c;因为RCP也增加了对控制系统用户接口开发的限制。 Phoebus项目…

【Spring源码】AOP的开端:核心对象创建的准备工作

AOP的核心成员是如何被被加载的&#xff1f;本篇我们主要分析使用xml的逻辑&#xff0c;如果使用注解&#xff0c;增加注解处理类即可&#xff08;ConfigurationClassPostProcessor&#xff09;拿之前分析循环的时候举的例子&#x1f330;&#xff0c;它的日志切面就是通过xml进…

119.(leaflet篇)文字碰撞

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

如何从 Android 手机上的 SD 卡恢复已删除的照片

为了扩展手机的存储空间&#xff0c;很多人都会在安卓手机上插入一张SD卡来存储一些大文件&#xff0c;比如电影、照片、视频等。虽然SD卡给我们带来了很大的方便&#xff0c;但我们还是避免不了数据丢失一些事故造成的。您是否正在为 SD 卡上的照片意外丢失而苦恼&#xff1f;…

工作中常用且容易遗忘的css样式整理,建议收藏

1. 文字超出部分显示省略号单行文本的溢出显示省略号&#xff08;一定要有宽度&#xff09;p{width:200rpx;overflow: hidden;text-overflow:ellipsis;white-space: nowrap;}多行文本溢出显示省略号p {display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: …

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考

干货干货FPGA lattice深力科 FPGA性能优势以及市场前景分析 以及lattice MachXO2系列MachXO3系列资料参考 那什么是FPGA芯片呢&#xff1f;FPGA全称为&#xff1a;现场可编程逻辑门阵列&#xff08;Field-Programmable Gate Array&#xff09;&#xff0c;是基于通用逻辑电路阵…

C语言实现顺序表(pushback pushfront popback popfront insert erase find)

顺序表&#xff0c;是常用的一种数据结构&#xff0c;他的底层是连续的物理内存&#xff0c;所以他可以在O&#xff08;1&#xff09;的时间访问下标为N的位置&#xff0c;而且很多操作都是基于顺序表才可以操作的&#xff0c;例如:排序 所以顺序表是很重要的&#xff0c;他和…

taobao.item.update.listing( 一口价商品上架 )

&#xffe5;开放平台基础API必须用户授权 单个商品上架输入的num_iid必须属于当前会话用户 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoCl…

SpringBoot入门 - 定制自己的Banner

我们在启动Spring Boot程序时&#xff0c;有SpringBoot的Banner信息&#xff0c;那么如何自定义成自己项目的信息呢&#xff1f;什么是Banner我们在启动Spring Boot程序时&#xff0c;有如下Banner信息&#xff1a;那么如何自定义成自己项目的名称呢&#xff1f;如何更改Banner…

一天约了4个面试,复盘一下面试题和薪资福利

除了最新的面经分享&#xff0c;还有字节大佬的求职面试答疑&#xff0c;告诉你关键问题是什么&#xff1f;少走弯路。**另外本文也汇总了6份大厂面试题&#xff1a;字节、腾讯、小米、腾讯云、滴滴、小米游戏。**希望对大家有帮助。 前言 昨天我的交流群里&#xff0c;有位宝…

【学习笔记】深入理解JVM之对象的实例化

参考尚硅谷JVM 102 - 106 集 首发地址&#xff1a;地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance&#xff08…

精选博客系列|公用事业中的VMware:在边缘重新定义价值

VMware 已经成为公用事业行业的核心。您可以在那里找到例如 VMware vSphere&#xff08;包括基础 Hypervisor ESXi 和 VMware vCenter 建立的整体控制平面&#xff09;的核心产品。来自软件定义的基础架构带来的诸多好处使 IT 团队将其先前基于硬件的系统转变为 VMware Cloud F…

GPT+时代来临:OpenAI开放GPT3.5模型,1000token仅1毛钱

GPT3.5 Model API 使用指南 今天OpenAI公司开放了最新的GPT3.5模型&#xff1a;gpt-3.5-turbo&#xff0c;也就是目前网页版的ChatGPT使用的模型。而此前OpenAI开放的最新的模型text-davinci-003则是基于GPT3模型构建的。并且价格十分便宜&#xff1a;1000 token/0.002美元&am…

CVE-2021-2109 WebLogic JNDI 注入

0x01 前言学习一下 WebLogic JNDI 注入 RCE&#xff08;CVE-2021-2109&#xff09;0x02 环境搭建和之前 WebLogic 的环境搭建是一致的&#xff0c;本文不再赘述。不过值得一提的是&#xff0c;我的 weblogic 版本是 10.3.6&#xff1b;需要手动添加 \server\lib\consoleapp\web…

打电话,玩手机、摔倒行人行为识别

文章大纲 数据集准备一些难点paddle 解决方案行为识别打电话摔倒开源解决方案前文: 深度学习与视频分析简介视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等数据集准备 我们可以从开源数据中挑选一些 参考文章: 使用python 脚本挑出coco 数据集…