Spring系列文章:Bean的作⽤域

news2024/11/17 7:35:38

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();
    }
}

结果

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

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

相关文章

会声会影2023免费版电脑视频剪辑软件

会声会影视频剪辑软件对硬件配置要求不高&#xff0c;功能强大且涵盖面广&#xff0c;能为用户节省出大量的硬件成本与学习时间成本。大多数用户仅需一周左右的时间就可以掌握会声会影的基本功能模块&#xff0c;会声会影视频剪辑软件&#xff0c;已经拥有了超过20年的品牌历史…

微软hotmail邮箱的存储空间查询

我最近注册了hotmail邮箱&#xff0c;查询到的存储空间如下&#xff1a; 我们关注的存储应该是下面的电子邮箱存储&#xff0c;15 GB&#xff0c;还是比较大的。 而上面的存储是Microsoft账户存储。 我打算用hotmail邮箱以邮件的形式存储一些重要资料。

2024年浙江财经大学MBA招生简章发布:有哪些看点?

2024年研究生招生简章近期正在陆续发布&#xff0c;作为立足浙江十余年的专业机构&#xff0c;杭州达立易考教育带领考生们来认真分析一下各MBA项目的招生政策以及趋势&#xff0c;以方面在接下来的全国研究生考试网报期间顺利选到适合自己的项目&#xff01;本期围绕浙江财经大…

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%!

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%! 信用账户是指一种可以在购物和信贷过程中使用的账户。它通常与信用卡或贷款相关联&#xff0c;在购物或信贷过程中可以使用它来进行支付。 融资融券是一种证券投资方式&#xff0c;可以通过券商开通该服务。以下…

《DevOps实践指南》- 读书笔记(九)

DevOps实践指南 25. 附录附录 1 DevOps 的大融合精益运动敏捷运动Velocity 大会运动敏捷基础设施运动持续交付运动丰田套路运动精益创业运动精益用户体验运动Rugged Computing 运动 附录 2 约束理论和核心的长期冲突附录 3 恶性循环列表附录 4 交接和队列的危害附录 5 工业安全…

【HBuilderX】解决黑色主题中的注释颜色太浅的问题(代码示例)

打开后&#xff0c;搜索Comment&#xff0c;修改&#xff0c;一个是//的颜色&#xff0c;一个是注释内容的颜色

LOG方案整理(持续更新)

LOG方案整理&#xff08;持续更新&#xff09; 一.日志文件格式 基本日志格式主要包含四种内容 1. 事件发生时间 2. 发生事件的主机名 3. 发生事件的服务或程序&#xff08;或内核&#xff09;&#xff0c;包含进程PID 4. 事件内容 二.日志文件分析 内核及大多数系统消息 内核及…

(二十九)大数据实战——kafka集群节点服役与退役案例实战

前言 本节内容是关于kafka集群节点的服役与退役&#xff0c;从而实现kafka集群的缩容与扩容。在开始本节内容之前&#xff0c;我们要预先安装好kafka集群&#xff0c;并准备一台空余的服务器用来完成我们扩容与缩容的案例。关于kafka集群的安装内容这里不在赘述&#xff0c;相…

在微信公众号怎么实现每日签到功能

在微信公众号中实现每日签到功能&#xff0c;可以为企业或公众号运营者带来许多好处。每日签到功能不仅可以增加用户粘性&#xff0c;提高用户参与度&#xff0c;还可以为公众号带来更多的流量和曝光度。那么&#xff0c;如何在微信公众号中实现每日签到功能呢&#xff1f;本文…

Docker中安装Jenkins

本篇主要讲如何在Docker中安装Jenkins&#xff0c;如果Docker未安装&#xff0c;可以先参考上一篇文章进行Docker安装。 【学习Docker&#xff08;一&#xff09;】centos系统 Docker 安装与卸载 安装 拉取镜像 docker pull jenkins/jenkins1 创建 Jenkins 挂载目录 mkdi…

滑动时间窗口的思想和实现,环形数组,golang

固定时间窗口 在开发限流组件的时候&#xff0c;我们需要统计一个时间区间内的请求数&#xff0c;比如以分钟为单位。所谓固定时间窗口&#xff0c;就是根据时间函数得到当前请求落在哪个分钟之内&#xff0c;我们在统计的时候只关注当前分钟之内的数量&#xff0c;即 [0s, 60…

​重生奇迹MU之亚特兰蒂斯​

如果你不喜欢一个玩家&#xff0c;那就让他去亚特兰蒂斯的中心区域去挂机吧&#xff01;因为&#xff0c;那里就是一个禁区般的存在&#xff0c;虽说还没有到达海魔希特拉的老巢&#xff0c;但是那里却驻扎着它最为忠心耿耿的一批手下&#xff0c;而且还是一群拥有法术技能的巫…

基于SSM的化妆品配方及工艺管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

SIT1145AQ收发器芯片CAN FD Passive功能详解(摘自官网)

芯力特在SIT1145AQ/FD版本中加入了CAN FD Passive功能&#xff0c;CAN FD Passive功能简单来说就是SIT1145AQ/FD在休眠或待机模式下屏蔽总线上的CAN FD报文。 为什么需要CAN FD Passive功能呢&#xff1f; SIT1145AQ的特定帧唤醒只支持CAN报文&#xff0c;当SIT1145AQ休眠模式…

和数集团:我国区块链行业发展具有广阔前景

区块链技术正在引领全球新一轮技术变革和产业变革&#xff0c;推动“信息互联网”向“价值互联网”变迁。 公开资料显示&#xff0c;区块链是一种由多方共同维护&#xff0c;使用密码学保证传输和访问安全&#xff0c;能够实现数据一致存储、难以篡改、防止抵赖的记账技术&…

基于el-tooltip组件封装超出显示省略号,鼠标hover显示tooltip的组件

基于el-tooltip组件封装超出显示省略号&#xff0c;鼠标hover显示tooltip的组件 el-tooltip组件存在的问题&#xff1a; el-tooltip没有行超出显示省略号的功能使用了该组件每个hover都会显示tooltip&#xff0c;没有满足超出才显示的需求。 基于el-tooltip组件&#xff0c;…

双视觉Transformer(Dual Vision Transformer)

摘要 已经提出了几种策略来减轻具有高分辨率输入的自注意机制的计算&#xff1a;比如将图像补丁上的全局自注意过程分解成区域和局部特征提取过程&#xff0c;每个过程都招致较小的计算复杂度。尽管效率良好&#xff0c;这些方法很少探索所有补丁之间的整体交互&#xff0c;因…

C++ : 仿照Vector 手动实现自己的 MyVectory

1. 源代码 #include <iostream>using namespace std;template <typename T> class myVector { private:T* data;int size;int capacity; public:// 构造函数myVector() : data(nullptr), size(0), capacity(0) {}//拷贝构造函数myVector(const myVector& othe…

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 面试题10.11.峰与谷 四【题目描述】 在一个整数…

Vue学习笔记总结

目录 1、Vue核心 1.1什么是vue? 1.2什么是mvvm? ​编辑 1.3插值表达式{{}} 2.Vue中的常用指令 2.1内容渲染指令 2.2条件渲染指令 2.3事件绑定指令 2.4属性绑定指令 2.5列表渲染指令 2.5.1小案例-小黑的书架 2.6v-for中的key 2.7双向绑定指令 3.指令修饰符 3.1什…