Spring Bean作用域与生命周期

news2025/1/12 6:09:27

目录

Bean的作用域:

Bean有六大行为模式

1、singleton:单例模式(默认)

2、prototype: 原型模式(多例模式)

3、request: 请求作用域(Spring MVC)

4、session: 会话作用域(Spring MVC)

5、application: 全局作用域(Spring MVC)

6、websocket: HTTP WebSocket 作用域(Spring WebSocket)

applicationContext和singleton的区别 

Bean的生命周期 

1、实例化(给Bean分配内存空间) 

2、设置属性(对象注入)

3、Bean的初始化 

4、使用Bean

5、销毁Bean 

总结:


Bean的作用域:

一般情况下,对于变量的可用范围叫做作用域,或者说是定义某个变量的区域叫做作用域。 

而Bean的作用域指的是Bean在Spring容器中的行为模式。

Bean有六大行为模式

1、singleton:单例模式(默认)

singleton是Bean在Spring中默认的行为,这个默认的行为模式就是说一个类只有一个Bean对象,所有的用户都使用的同一个对象,如果有一个用户对这个对象进行了修改,那么所有的结果都会发生改变。

如:这样一个User类:

package com.demo.spring.beans;

public class User {
    private int Id;
    private String name;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "Id=" + Id +
                ", name='" + name + '\'' +
                '}';
    }
}

我们先使用@Bean注解给Spring中注入一个User对象 

package com.demo.spring.beans.Controller.Bean;

import com.demo.spring.beans.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

@Controller
public class UserBean {
    
    @Bean(name = "user")
    //使用getUser方法返回Bean对象
    public User getUser(){
        User user=new User();
        user.setId(1);
        user.setName("张三");
        return user;
    }
}

 然后使用@Autowired从Spring中获取到该Bean对象并进行修改:

package com.demo.spring.beans.Controller;

import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    private User user1;
    @Autowired
    public User getUser1(){
        User user=user1;
        user.setId(1);
        user.setName("李四");
        return user;
    }

}

然后再使用@Autowired直接从Spring中获取Bean对象:

package com.demo.spring.beans.Controller;

import com.demo.spring.beans.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class UserController2 {
    @Autowired
    private User user3;
    public User getUser3() {
        return user3;
    }
}

然后我们在App启动类中分别获取一下UserController和UserController2的Bean对象:

import com.demo.spring.beans.Controller.UserController;
import com.demo.spring.beans.Controller.UserController2;
import com.demo.spring.beans.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
        ApplicationContext context=new
                ClassPathXmlApplicationContext("spring-config.xml");
        UserController userController=  context.getBean("userController", UserController.class);
        User user=userController.getUser1();
        System.out.println("修改后的bean:"+ user);
        UserController2 userController2=context.getBean("userController2",UserController2.class);
        User user1=userController2.getUser3();
        System.out.println("最后获取的bean:"+user1);
    }
}

结果如图:

 也就是说,开始的时候我们的name是张三,经过第一次修改后,变成了李四,最后一个人在没有修改的前提下依然获得的是李四 。所以我们可以断定这个bean是同一个。也就是说Bean的作用域默认是Singleton(单例模式)单例可以节省内存开销,适合Bean对象不被随意更改的场景。

2、prototype: 原型模式(多例模式)

原型模式需要在注入Bean的时候就进行指定,需要在@Bean注解下或者五大类注解的下面指定注解:@Scope,并且在注解中指定一个值为prototype。这样其他地方获取Bean的时候,就不是同一个了,而是一个新的Bean实例。(通常有状态的Bean使用该作用域) 

 

Bean的内容容易被修改的场景中适合使用该种作用域。

3、request: 请求作用域(Spring MVC)

每次http请求会创建新的Bean实例,类似于prototype

场景:⼀次http的请求和响应的共享Bean

备注:限定SpringMVC中使⽤

4、session: 会话作用域(Spring MVC)

在⼀个http session中,定义⼀个Bean实例

场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息

备注:限定SpringMVC中使⽤

5、application: 全局作用域(Spring MVC)

在⼀个http servlet Context中,定义⼀个Bean实例(这个Bean也是单例的)

场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息

备注:限定SpringMVC中使⽤

6、websocket: HTTP WebSocket 作用域(Spring WebSocket)

在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bea实例

场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直WebSocket结束都是同⼀个Bean。

备注:限定Spring WebSocket中使⽤

applicationContext和singleton的区别 

1、作用域不一样:singleton是Spring Core的作用域,而application是Spring Web中的作用域。

2、作用的容器不一样:singleton是作用于Spring IOC的容器,而application是作用于Servlet的容器。

Bean的生命周期 

1、实例化(给Bean分配内存空间) 

2、设置属性(对象注入)

3、Bean的初始化 

①执行各种通知(执行各种 Aware)
②执行初始化的前置方法(BeanPostProcessor)
③ 执行构造方法,两种执行方式,一种是执行 @PostConstruct,另一种实质性 init-method
④ 执行初始化的后置方法(BeanPostProcessor)

4、使用Bean

5、销毁Bean 

执行销毁容器的各种方法,例如@PreDestroyDisposableBean方法destroy-method方法

总结:

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

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

相关文章

M1 Mac安装Zookeeper

下载Zookeeper 由于通过homebrew下载的zookeeper没有conf文件夹,因此我们在官网下载 zookeeper-3.7.1 然后下载上面这个 将解压后的文件转移到 /usr/local 更改配置文件 1、配置文件位置位于解压文件夹下conf文件夹内部,默认名字为zoo_sample.cfg&…

Unity设计模式—命令队列

Unity设计模式—命令队列 概要 本篇将介绍命令队列并用命令队列模式实现一个Unity里的WindowManager。 命令队列是一个按照FIFO顺序存储一系列通知或请求的队列。发出通知时系统会将请求置入队列并立即返回,请求处理器随后从命令队列中获取并处理这些请求。请求可由…

集合专题·拔高·壹

文章目录 1 Collection单列集合、Map双列集合1.1 Collection单列集合1.1.1 Collection单列集合及其实现类1.1.1.1 list集合与Array数组1.1.1.1.1 ArrayList1.1.1.1.2 LinekdList1.1.1.1.2 Vector1.1.1.1.2.1 ArrayList、Vector (线程安全)的区别是什么1.…

【数据结构与算法】前缀和+哈希表算法

文章目录 一、引入二、前缀和与哈希表的结合三、例题3.1 和为 K 的子数组3.2 统计「优美子数组」3.3 路径总和III 四、总结 一、引入 关于前缀和和哈希这两个概念大家都不陌生,在之前的文章中也有过介绍:前缀和与差分算法详解 而哈希表最经典的一题莫过…

Kerberos设计和落地长常识

Kerberos 处理三类安全对象 票证 kerberos票证授予服务给每个客户发一张标记,该标记发送给一个特殊的服务器,证实kerberos最近已经认证了发送者,票证包括过期时间和新生成的会话密钥供客户和服务器使用。 认证 由客户构造的一个标记&#xff…

LVS负载均衡之NAT模式

实验准备四台虚拟机 192.168.255.128 做负载均衡器(两张网卡,且都需要NAT模式) 192.168.255.130 Nginx节点服务器1 192.168.255.131 Nginx节点服务器2 192.168.255.132 nfs共享服务器 现将四台虚拟机的防火墙关闭 一、nfs服务器配置 1…

使用Visual Studio 创建Windows服务,并安装部署

创建服务的工程 Program.cs是入口类,Service1.cs是写服务功能的组件,类似于winform项目中的Form1.cs。 打开Service1.cs,(右键单击Service1.cs,选择查看源码) OnStart:服务启动时,执…

产品说明书应该如何制作?

在当今互联网时代,产品说明书无疑是一种展示产品特性、引导用户使用和解决用户问题的重要方式。一份精心制作的产品说明书,能够让用户更快地了解和掌握产品的使用方法,让用户充分享受产品带来的便利。不过要做出一份高质量的产品说明书&#…

算法:在指定范围内生成随机不重复的位置

问题: 在游戏中,我们经常会遇到以下问题:在指定的范围内生成随机不重复的位置。 比如某次“神官赐福”活动中,需要在城门口生成n个不重复的宝箱。 针对这种问题,我们可以先将范围按照宝箱(基本单元格&#…

塔望食研院丨百年益生菌,千亿市场正蓝海!

2022年12月塔望咨询开设塔望食品大健康消费研究院(简称塔望食研院)栏目,塔望食研院以“为食品行业品牌高质量发展赋能”为理念,将不定期发布食品大健康行业研究、消费研究报告。塔望食研院致力于结合外部数据、消费调研数据、企业…

目标追踪篇---yolov8_tracking复现

文章目录 目标追踪篇---yolov8_tracking复现1、下载源代码2、下载权重3、运行代码3.1、运行以下命令:3.2、结果如下3.3、视频结果 目标追踪篇—yolov8_tracking复现 本人的另一篇博客,本博客主要是源代码更新产生的新博客,比较过后两者还是有…

计算多列迭代次数的一种平均列近似方法

比较多列训练集的迭代次数,把多列训练集用单列近似,再通过计算单列的斥力比较迭代次数的大小顺序。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点,AB各由5张二值化的图片组成,让A中有5个1,B中全是0&a…

魔兽服务端 MANGOS 数据库结构表中文解释

魔兽服务端 MANGOS 数据库结构表中文解释 MANGOS 数据库结构表 achievement_reward 巫妖王的奖励成就 areatrigger_involvedrelation 传送(区域触发)_包含的任务关系 areatrigger_scripts 区域触发脚本 areatrigger_tavern 进传送门…

优维低代码:个性化桌面配置

导语 优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。…

分布式系统概念和设计——安全模型中的设计和思考落地

分布式系统概念和设计 安全性攻击的形式——窃听,伪装,篡改,拒绝服务等。 可靠的分布式系统设计必须解决暴露的服务接口和不安全网络的问题,而攻击者可能了解其中所使用的算法并部署计算资源。 密码学为消息的私密性和完整性以及认…

Windows环境下的静态库和动态库的使用详解

文章目录 简介lib库的详细说明第一种是静态lib库第二种是lib导入库两种库的说明两种lib库的相同点和不同点 在visual studio下静态lib库的导出和使用导出过程演示使用过程演示使用方式一使用方式二使用方式三使用方式四使用方式五使用方式六使用方式七其他组合方式 在visual st…

2022-04-24:用go语言重写ffmpeg的muxing.c示例。

2022-04-24:用go语言重写ffmpeg的muxing.c示例。 答案2022-04-24: 本程序的大体过程如下: 打开输出文件并写入头部信息。 添加音频和视频流,并为每个流创建 AVCodecContext 对象,根据输入格式设置编码器参数&#x…

Volatile与ThreadLocal

一:Volatile 线程安全三方面 1 可见性:一个线程对共享变量修改,另一个线程可以看到最新结果 2 有序性: 一个线程内,代码编写按顺序执行 3 原子性: 一个线程内多行代码以一个整体运行,期间不能…

查询网站ip地址

IP地址是Internet Protocol(互联网协议)的一部分,是一个32位的数字,用于标识网络中的设备。它可以让不同的设备在网络上进行通信和交流,是网络通信的基础。IP地址的应用非常广泛,它可以用于识别和定位设备&…

最新数据, 芯片工程师平均月薪高达2.56W !

近日,据2023年一季度经济运行数据统计,其中提及全国居民人均可支配收入达到10870,同比增长3.8%。 2023年第一季度中,共有20个行业平均月薪超1W,除了大家所熟悉的金融行业薪资水平排名靠前,一些高技术制造业…