Spring--Bean的作用域,生命周期

Bean的作用域

Bean的作用域有很多种,在Spring Framework中支持6种(其中有四种只有在web环境中才能生效),同时Spring还支持自定义Bean的范围。

Spring Framework中支持的6种范围:

作用域解释
singleton每个Spring IoC容器内同名称的bean只有一个实例(默认)
prototype

每次使用该bean时会创建新的实例

request每个HTTP请求生命周期内,创建新的实例(web环境中)
session每个HTTP Session生命周期内,创建新的实例(web环境中)
application每个ServletContext生命周期内,创建新的实例(web环境中)
websocket每个WebSocket生命周期内,创建新的实例(Web环境中)

如果想要更改 Bean 的作用域应该如何进行设置呢?

@Scope

我们可以通过修改@Scope注解中的value属性的值来修改Bean的作用域。

singleton

当我们直接在Spring中定义一个Bean时此时它默认的作用域是 singleton(单例)。

此时先定义一个类,然后将它交给Spring管理:

public class Dog {public String name;public Dog(){};public Dog(String name){this.name = name;}
}
@Component
public class Demo {@Beanpublic Dog dog() {Dog dog = new Dog();return dog;}
}

此时我们通过ApplicationContext对象来从容器中分两次拿取,看两次拿取的类是否相同。

@SpringBootApplication
public class Application {public static void main(String[] args) {//获取Spring的上下文ApplicationContext context = SpringApplication.run(Application.class, args);Object dog1 = context.getBean("dog");Object dog2 = context.getBean("dog");System.out.println(dog1);System.out.println(dog2);}
}

从打印的结果中我们可以看出dog1和dog2这两个对象是相同的。

prototype

将Bean作用域修改为 prototype 之后再进行打印观察,通过结果可以看出是两个不同的对象:

@Component
public class Demo {@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public Dog dog() {Dog dog = new Dog();return dog;}
}

注意:request,session,application,websocket这四中作用域下的Bean只能再Web环境中获取,否则会报如下异常:

在web环境中获取Bean对象:

@RestController
@RequestMapping("/bean")
public class BeanController {@Autowiredprivate Dog dog1;@Autowiredprivate Dog dog2;@RequestMapping("/fun")public String test() {return "<p>"+dog1.toString()+"</p><p>"+dog2.toString()+"</p>";}
}

@RequestScope

被该注解修饰表示该Bean的作用域是 request 。

@Component
public class Demo {@Bean@RequestScopepublic Dog dog() {Dog dog = new Dog();return dog;}
}

当通过浏览器获取结果是发现这两个Bean是相同的,但是如果再刷新一下浏览器就会发现两次访问获取的结果不同:

@SessionScope

被该注解修饰表示该Bean的作用域为 session 。

@Component
public class Demo {@Bean@SessionScopepublic Dog dog() {Dog dog = new Dog();return dog;}
}

此时通过浏览器获取结果,可以从结果中得知同一个浏览器的结果相同,不同浏览器结果不同。 

@ApplicationScope

该注解表示被修饰地Bean的作用域为 application 。

@Component
public class Demo {@Bean@ApplicationScopepublic Dog dog() {Dog dog = new Dog();return dog;}
}

Application scope就是对于整个web容器来说,bean的作用域是ServletContext级别的。这个和
singleton有点类似,区别在于:Application scope是ServletContext的单例,singleton是一个
ApplicationContext的单例,在⼀个web容器中ApplicationContext可以有多个。

Bean的生命周期

Bean的生命周期指的是Bean对象从创建直到销毁的全过程。

Bean的生命周期大致可以分为以下5步:

实例化(为Bean对象分配内存空间);

属性赋值(Bean注入或装配,如@AutoWired);

初始化;

  • 执行各种通知,如 BeanNameAware, BeanFactoryAware ,ApplicationContextAware 的接口方法
  • 执行初始化方法:
  1. xml定义 init-method
  2. 使用注解的方式 @PostConstruct
  3. 执行初始化后置方法(BeanPostProcessor )

使用Bean;

销毁Bean。

光这么看有点抽象,下面用代码展示一下:

@Slf4j
@Component
public class Animal {public Dog dog;//实例化public Animal() {log.info("执行构造方法");}//属性注入@Autowiredpublic void setDog(Dog dog) {this.dog = dog;log.info("属性注入");}//初始化@PostConstructpublic void init() {log.info("执行初始化方法");}//使用public void use() {log.info("use");}//销毁@PreDestroypublic void destroy() {log.info("执行destroy方法");}
}

接下来执行这个类中的use()方法,然后观察打印结果:

@SpringBootApplication
public class Application {public static void main(String[] args) {//获取Spring的上下文ApplicationContext context = SpringApplication.run(Application.class, args);Animal animal = (Animal) context.getBean("animal");animal.use();}
}

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

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

相关文章

优化MySQL连接管理:深入解析max_connections参数与解决Too Many Connections策略

前言 ​ 在现代的数据库管理中&#xff0c;合理配置max_connections参数对于确保MySQL数据库的稳定性和高效性至关重要。本文将深入探讨max_connections的基本概念&#xff0c;分析导致“Too many connections”错误的常见原因&#xff0c;并提供一系列解决方案&#xff0c;以…

QStack、QQueue 先进后出 先进先出 用法

实验QStack的先进后出和 QQueue 的先进先出 QStack、QQueue #include <QCoreApplication> #include <QDebug> #include <QStack> #include <QQueue>//栈的使用 后进先出void QStackPrint(){QStack<int> stack;stack.push(10);stack.push(20);st…

从零到一建设数据中台(番外篇)- 数据中台UI欣赏

番外篇 - 数据中台 UI 欣赏 话不多说,直接上图。

想让谷歌独立站关键词排名一飞冲天?这个秘密技巧必须知道!

在激烈的谷歌排名竞争中&#xff0c;我们要确保自己优化的独立站在谷歌搜索结果中占据首页位置至关重要。排名首页不仅能显著提高展现和流量&#xff0c;还能带来更多潜在客户和业务机会。本文将从谷歌SEO技术的角度&#xff0c;深入探讨在谷歌独立站关键词排名首页最重要的几个…

ShardingSphere跨表查询报错

目录 一、场景简介二、报错信息三、SQL四、原因五、解决方法一、调整SQL&#xff0c;不使用子查询方法二、将子查询的SQL独立出来&#xff0c;后续连接逻辑由代码处理 一、场景简介 1、使用ShardingSphere按月份进行分表 2、单月查询正常&#xff08;单表&#xff09; 3、跨…

CA证书及PKI

文章目录 概述非对称加密User Case: 数据加密User Case: 签名验证潜在问题 CACA证书的组成CA签发证书流程CA验证签名流程CA吊销证书流程 PKI信任链证书链 概述 首先我们需要简单对证书有一个基本的概念&#xff0c;以几个问题进入了解 ❓ Question1: 什么是证书&#xff1f; 证…

福利|免费申请长期单域名、通配符、多域名SSL证书,不限量

一、什么是单域名、通配符、多域名SSL证书 单域名证书&#xff1a;仅保护一个特定的域名。 通配符证书&#xff1a;保护一个主域名及其所有二级子域名。 多域名证书&#xff1a;在同一张证书中保护多个不同的域名&#xff0c;可以是主域名也可以是子域名&#xff0c;域名之间…

目前比较好用的LabVIEW架构及其选择

LabVIEW提供了多种架构供开发者选择&#xff0c;以满足不同类型项目的需求。选择合适的架构不仅可以提高开发效率&#xff0c;还能确保项目的稳定性和可维护性。本文将介绍几种常用的LabVIEW架构&#xff0c;并根据不同项目需求和个人习惯提供选择建议。 常用LabVIEW架构 1. …

Invalid keystore format,获取安全码SHA1值出错

AndroidStudio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 项目运行JDK版本&#xff1a;11.0.15&#xff0c;查看方法如下&#xff1a; 在Terminal 窗口中&#xff0c;获取的Java版本是&#xff1a;1.8.0&#xff0c;修改Java系统环境变量&#xff0c;改成&#…

如何在MySQL中创建不同的索引和用途?

目录 1 基本的 CREATE INDEX 语法 2 创建单列索引 3 创建多列索引 4 创建唯一索引 5 创建全文索引 6 在表创建时添加索引 7 使用 ALTER TABLE 添加索引 8 删除索引 9 索引管理的最佳实践 10 示例 在 MySQL 中&#xff0c;索引&#xff08;index&#xff09;是一种用于…

Git保姆级教程

目录 Git是什么&#xff0c;为什么要学这个工具&#xff1f; 码云注册并创建仓库 Git安装 查看本地仓库状态 添加到暂存区 提交到本地库 修改文件 版本回退 创建、切换和删除分支 合并分支 克隆远端库到本地 将本地库推送到远端库 命令设置别名 Git是什么&#xf…

远程咨询的好处都有哪些呢?

随着科技的飞速发展&#xff0c;远程咨询正逐渐成为人们获取医疗服务的一种新方式。那么什么是远程咨询呢&#xff1f;其又有哪些好处呢&#xff1f;下面就给大家详细地说说。 远程咨询的概念 远程咨询&#xff0c;顾名思义&#xff0c;是指通过互联网技术&#xff0c;实现患…

LeetCode 746.使用最小花费爬楼梯

题目&#xff1a; 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费…

使用try-catch捕获异常到底会不会影响性能?尤其是try-catch还比较多的情况下?

从字节码层面来看&#xff0c;没抛错两者的执行效率其实没啥差别。 “那为什么网上流传着try-catch会有性能问题的说法啊&#xff1f; 这个说法确实有&#xff0c;在《Effective Java》这本书里就提到了 try-catch 性能问题&#xff1a; 总结&#xff1a; 1、try-catch 相比较…

C++ STL std::map的实现机制【面试】

基于红黑树&#xff1a;std::map 利用红黑树的数据结构来存储数据&#xff0c;确保了操作的平衡性和效率。 自动排序&#xff1a;红黑树保证了元素的有序性&#xff0c;即元素会根据键自动排序。 唯一键值&#xff1a;每个键都是唯一的&#xff0c;如果尝试插入重复的键&…

联想测开一面(电话面试)笔试60%

3.21 无自我介绍基本问项目&#xff0c;问实习对python自动化测试了解多少讲一下python中打包和解包的概念学校无测试相关课程&#xff0c;平时用什么平台去学习的计算机底层实现原理简要说说&#xff08;软硬结合&#xff09;大致讲一下了解的C的一些数据结构C指针和数组的区…

【TensorFlow深度学习】DQN(Deep Q-Network)算法详解

DQN&#xff08;Deep Q-Network&#xff09;算法详解 DQN&#xff08;Deep Q-Network&#xff09;算法详解&#xff1a;深度强化学习的里程碑DQN算法原理代码实现结语 DQN&#xff08;Deep Q-Network&#xff09;算法详解&#xff1a;深度强化学习的里程碑 在强化学习的浩瀚宇…

汇编:数组数据传送

要在32位汇编中实现数组数据的传送&#xff0c;可以使用字符串操作指令 MOVS 以及其前缀 REP&#xff0c;可以高效地复制数组数据。 MOVS 指令是一种字符串操作指令&#xff0c;用于将数据从源地址移动到目标地址。MOVS 指令有不同的变种&#xff0c;可以处理不同大小的数据&a…

水印怎么去除?Windows 上的最佳水印软件

我们都知道&#xff0c;任何水印软件都可以防止您的数字财产被盗。此外&#xff0c;水印是一种虚拟营销元素&#xff0c;可以帮助您推广您的作品。 奇客水印管家是 Internet 上适用于 Windows 7、8 、10 和 11 的最高效的水印软件。此外&#xff0c;它还允许用户通过添加或删除…

计算机基础之:UMA与NUMA区别

基础 UMA&#xff08;Uniform Memory Access&#xff09;与NUMA&#xff08;Non-Uniform Memory Access&#xff09;是两种不同的内存架构设计&#xff0c;主要应用于多处理器系统中&#xff0c;它们的主要区别在于内存访问的效率和方式&#xff1a; UMA&#xff08;Uniform …