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 {
    @Bean
    public 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 {
    @Autowired
    private Dog dog1;
    @Autowired
    private Dog dog2;

    @RequestMapping("/fun")
    public String test() {
        return "<p>"+dog1.toString()+"</p><p>"+dog2.toString()+"</p>";
    }
}

@RequestScope

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

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

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

@SessionScope

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

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

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

@ApplicationScope

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

@Component
public class Demo {
    @Bean
    @ApplicationScope
    public 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("执行构造方法");
    }
    //属性注入
    @Autowired
    public void setDog(Dog dog) {
        this.dog = dog;
        log.info("属性注入");
    }
    //初始化
    @PostConstruct
    public void init() {
        log.info("执行初始化方法");
    }
    //使用
    public void use() {
        log.info("use");
    }
    //销毁
    @PreDestroy
    public 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();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数学建模】微分方程的数值求解

微分方程的数值求解 一阶差分求解微分方程原理:四阶龙格-库塔方法应用:小船渡河问题: 进阶求二阶微分方程 一阶差分求解微分方程原理: d y d x f ( x n , y n ) \dfrac{dy}{dx}f(x_n,y_n) dxdy​f(xn​,yn​) y n 1 − y n x n 1 − x n f ( x n , y n ) \dfrac{y_{n1}-y_n…

React+TS前台项目实战(一)-- 项目初始化配置及开此系列的初衷

文章目录 前言一、初始化项目二、基础配置1. 项目目录及说明如下2. TS版本使用Craco需注意 总结 前言 前面 后台管理系统实战 系列教程暂时告一段落了&#xff0c;想了解全局各种配置的可自行查看。本次教程将重点介绍React前台项目的实操&#xff0c;关于具体的配置&#xff…

51单片机-数码管显示多个

目录 简介: 一. 简单全亮 二. 控制单个变化 三. 2024 书接上回 51单片机-数码管显示单个 http://t.csdnimg.cn/Ii6x0 简介: 51 单片机作为控制核心&#xff0c;可以与数码管相连接来实现数字的显示。 数码管通常有多个段&#xff0c;通过控制这些段的点亮和熄灭状态&…

弘君资本炒股技巧:银行降准对股票的影响?

银行降准会带动股票市场变得相对活泼起来&#xff0c;假如降准前股价在跌落状态&#xff0c;降准能够起到一定缓冲股价跌落的效果。 什么是降准&#xff1a;降准指的是减少银行在央行的存款准备金率&#xff0c;也便是说银行需求存放于央行的资金份额下降&#xff0c;银行能够…

Tensorflow2.10 完成图像分割任务

前言 图像分割在医学成像、自动驾驶汽车和卫星成像等方面有很多应用&#xff0c;本质其实就是图像像素分类任务&#xff0c;也就是使用深度学习模型为输入图像的每个像素分配一个标签&#xff08;或类&#xff09;。 准备 本文的准备如下&#xff0c;使用 pip 安装如下配置&…

动态内存管理<C语言>

导言 在C语言学习阶段&#xff0c;指针、结构体和动态内存管理&#xff0c;是后期学习数据结构的最重要的三大知识模块&#xff0c;也是C语言比较难的知识模块&#xff0c;但是“天下无难事”&#xff0c;只要认真踏实的学习&#xff0c;也能解决&#xff0c;所以下文将介绍动态…

成都石室中学学子游汶鑫展现新时代好少年风采 拾金不昧获表彰

在繁华的都市中,每天都有无数的故事在上演,而其中的一些故事,却以其独特的温暖和正能量,深深打动着我们的心灵。近日,成都石室中学初中学校的一名学生游汶鑫同学,就用他的实际行动,诠释了新时代好少年的风采,展现了中华民族传统美德在当代青少年身上的生动体现。 成都石室中学初…

# Mac下反编译微信小程序获得源码

Mac下反编译微信小程序获得源码 所需工具 mac版微信 最好3.8以上版本node环境wxappUnpacker wxappUnpacker: 小程序反编译(支持分包) 小程序反编译(支持分包) https://gitee.com/ksd/wxappUnpacker 大体步骤 用微信搜索打开对应小程序&#xff0c;为的是把产物文件加载到…

郑州小区火灾防范需重视:可燃气体报警器检测的日常管理与维护

近日&#xff0c;郑州市一小区发生了一起严重的火灾事故&#xff0c;这起事故不仅给遇难者家属带来了巨大悲痛&#xff0c;也再次引发了社会对于小区火灾防范与应急处理的关注。 在对此次事故进行深入分析的同时&#xff0c;我们不得不思考可燃气体报警器在小区火灾检测中的重…

选课清单--数据结构课程设计(十字链表+哈希表实现)

题目如上(九院版&#xff0c;被老师要求选这个题目做&#xff0c;不知道还有没有别的学校是这种题目&#xff0c;都可以相互借鉴hh) 代码写的有冗余&#xff0c;结构体应该有三个&#xff0c;一个学生&#xff0c;一个课程&#xff0c;一个十字链表的结构体&#xff0c;如果公…

如何有效处理服务器后台密码暴露

服务器后台密码的暴露是信息安全领域中的严重事件&#xff0c;它可能引发未经授权的数据访问、恶意软件植入或系统功能滥用等一系列问题。本文将探讨几种处理服务器后台密码暴露的有效策略&#xff0c;包括紧急响应步骤、密码安全增强措施及长期预防机制&#xff0c;并提供实际…

【LeetCode 第 401 场周赛】K秒后第 N 个元素的值

文章目录 1. K秒后第 N 个元素的值&#x1f197; 1. K秒后第 N 个元素的值&#x1f197; 题目链接&#x1f517; &#x1f427;解题思路&#xff1a; 前缀和 小规律&#x1f34e; &#x1f34e; 从上图观察可知&#xff0c;规律一目了然&#xff0c;arr[i] arr[i] 对上一…

【机器学习】基于3D CNN通过CT图像分类预测肺炎

1. 引言 1.1. 研究背景 在医学诊断中&#xff0c;医生通过分析CT影像来预测疾病时&#xff0c;面临一些挑战和局限性&#xff1a; 图像信息的广度与复杂性&#xff1a; CT扫描生成的大量图像对医生来说既是信息的宝库也是处理上的负担。每组CT数据可能包含数百张切片&#xf…

代码随想录算法训练营第36期DAY57

DAY57 今天的好消息&#xff1a;能去华五。 1143最长公共子序列 Code: class Solution {public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>> dp(text1.size()1,vector<int>(text2.size()1,0)); f…

【PowerDesigner】CDM生成PDM

目录 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 &#x1f30d;1.2 PowerDesigner使用环境 &#x1f30a;2. CDM生成PDM ​​​​​​​&#x1f30a;3. 研究心得 &#x1f30a;1. PowerDesigner简介 &#x1f30d;1.1 常用模型文件 主要使用Pow…

家具板材ENF级甲醛释放量检测 板材甲醛含量测定

ENF级甲醛释放量检测 ENF级是指甲醛释放量非常低的板材&#xff0c;它代表了无醛添加的最高级别。根据最新的国家标准GB/T 39600-2021&#xff0c;ENF级板材的甲醛释放量不得超过0.025 mg/m。这个标准比欧洲的E1级&#xff08;甲醛释放量≤0.124 mg/m&#xff09;和美国的P2标准…

2024年,计算机相关专业还值得选择

随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去很长一段时间里&#xff0c;计算机科学与技术、人工智能、网络安全、软件工程等专业一…

移动端浏览器的扫描二维码实现(vue-qrcode-reader与jsQR方式)

1. 实现功能 类似扫一扫的功能&#xff0c;自动识别到画面中的二维码并进行识别&#xff0c;也可以选择从相册中上传。 2. 涉及到的一些插件介绍 vue-qrcode-reader 一组用于检测和解码二维码的Vue.js组件 jsQR 一个纯粹的javascript二维码阅读库&#xff0c;该库接收原始…

使用 3D 图形 API 在 C# 中将 PLY 转换为 OBJ

OBJ和PLY是一些广泛使用的 3D 文件格式&#xff0c;易于编写和读取。这篇博文演示了如何以编程方式在 C# 中将 PLY 转换为 OBJ。此外&#xff0c;它还介绍了一种用于 3D 文件格式转换的在线3D 转换器。是的&#xff0c;Aspose.3D for .NET为程序员和非程序员提供了此功能来执行…

MTK烧录USB驱动下载

下载链接 https://www.catalog.update.microsoft.com/Search.aspx?qMediaTek%20USB%20Port 驱动安装教程 https://miuiver.com/install-official-mediatek-driver/