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

news2024/11/20 8:28:44

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

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

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

相关文章

Manav Garg:生成式人工智能时代的SaaS

随着Chatgpt推动的人工智能时代精神席卷全球&#xff0c;它将如何影响SaaS世界&#xff1f;SaaS创业公司将如何适应这个新时代&#xff1f; 新兴市场在哪里&#xff1f;虽然这种技术平台的转变将带来巨大的机会&#xff0c;但传统的印度SaaS剧本必须适应新的人工智能秩序。创始…

误操作全盘重新分区?数据恢复与防范策略全解析

一、全盘重新分区概述 全盘重新分区&#xff0c;指的是对硬盘或存储设备上的所有分区进行删除并重新创建新分区的操作。这一操作通常会导致原有分区中的数据被清除&#xff0c;给用户带来数据丢失的风险。在某些情况下&#xff0c;用户可能由于误操作或软件故障而进行了全盘重…

【ArcGISProSDK】OpenItemDialog打开文件对话框

打开单个文件 效果 代码 public async void OpenFunction() {// 获取默认数据库var gdbPath Project.Current.DefaultGeodatabasePath;OpenItemDialog openItemDialog new OpenItemDialog() { Title "打开要素文件",InitialLocation gdbPath,Filter ItemFilte…

2024军民两用智能装备技术展会:领略“5G边缘计算器”开启智能化数据处理新篇章

"占星者5G边缘计算器&#xff1a;开启智能化数据处理新篇章" 随着物联网和人工智能技术的迅猛发展&#xff0c;数据处理的需求日益增长&#xff0c;对计算设备的性能提出了更高的要求。在“2024年中国军民两用智能装备与通信技术产业展览会”上&#xff0c;占星者5G边…

教育小程序开发:技术实现与实践案例

随着信息技术的不断进步&#xff0c;教育小程序在教育领域的应用越来越广泛。教育小程序开发不仅可以提高教学效率&#xff0c;还能够提供个性化的学习体验。本文将以技术代码为例&#xff0c;详细介绍教育小程序开发的关键技术和实践案例&#xff0c;帮助开发者更好地理解和实…

数据结构与算法题目集(中文) 6-3 求链表的表长

该代码使用循环遍历链表来计算链表的长度。代码首先定义了一个整数变量i用于计数&#xff0c;并初始化为0。然后进入一个while循环&#xff0c;条件为链表L非空。在循环中&#xff0c;通过L L->Next来遍历链表中的每一个节点&#xff0c;并将计数变量i递增。最终返回计数变…

企业管理/市场经营/自我管理,500+个经典职场工具 . rar

​500N个实用管理工具包&#xff0c;精选人力资源从业者必备之132项工具、40个管理者实效管理工具、成功自我管理的29个工具、常见的9种营销分析工具等&#xff0c;成功自我管理必备工具。 与班主任联系&#xff0c;即可获得完整资料包&#xff01; 1.PEST分析 2.五力分析 3.…

大一学生分享网络编程聊天室-简单私聊

每天过得充实&#xff0c;你将不会焦虑 ---同行者联盟 Socket 是一种规范(标准)&#xff0c;封装了TCP协议的通信细节&#xff0c;使得我们使用它就可以完成与远端计算机的TCP链接&#xff0c;以及数据的传输。并且可以完成数据传输基于双向流的读写操作&#xff0c;Java语言…

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

图像识别是很常用的AR功能&#xff01;AR foundation 可以帮助我们轻松实现&#xff01; 1.安装插件 首先还是在资源包中导入ARfoundation 。然后搭建基本的AR ARFoundation框架&#xff01; 2.创建AR session 和XR origin结构&#xff01; 3.然后在XR Origin 物体身上添加A…

GIS之arcgis系列07:conda环境下安装arcpy环境

首先将python27环境下的“Desktop10.8.pth”拷贝到anaconda环境下。 路径如下&#xff08;仅参考&#xff09;&#xff1a; C:\Python27\ArcGIS10.8\Lib\site-packages\Desktop10.8.pth D:\Anaconda\Lib\site-packages 在anaconda prompt中穿创建一个新环境 conda create -…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

idea从git拉取代码需要输入token问题解决

idea使用git 推送代码时&#xff0c;提示token问题&#xff0c;这是因为你的代码仓库是gitlab&#xff0c; 然后打开修改代码后推送时&#xff0c;会默认使用gitlab插件&#xff0c;所以提示输入token解决方式就是把gitlab插件取消使用这样就好了。 取消之后再进行拉取代码即可…

华为鲲鹏应用开发基础:鲲鹏处理器及关键硬件特性介绍(二)

1. 鲲鹏简介 1.1 鲲鹏处理器简介 鲲鹏处理器是华为自研的基于ARMv8指令集开发的数据中心级处理器 1.2 基于鲲鹏主板的多样化计算产品 1.3 基于鲲鹏920的华为TaiShan(泰山) 200服务器 1.3.1 TaiShan 2280服务器内部视图 1.3.2 TaiShan 2280服务器物理结构 1.3.3 TaiShan 2280服…

4_机械臂位姿求逆理论及代码计算

1、aubo arcs sdk poseInverse 使用例子 auto cur_pose rpc_cli->getRobotInterface(robot_name)->getRobotState()->getTcpPose();// 2.288083 0.035207 1.550335auto pose_inv rpc_cli->getMath()->poseInverse(cur_pose);//结果&#xff1a;0.118611 -0.57…

数据不归路?文件清理的后悔药,2个文件恢复技巧

手机已成为我们生活中不可或缺的重要工具&#xff0c;它不仅仅是一个通讯设备&#xff0c;更是我们存储个人信息、工作文件、照片和视频等宝贵资料的仓库。然而&#xff0c;生活中的意外总是难以预料&#xff0c;有时候我们可能会不小心删除重要的文件&#xff0c;或者因为手机…

【c语言】文件操作,解开你的疑惑

文件操作 为什么使用文件什么是文件文件的分类文件名 二进制文件和文本文件文件的打开与关闭流与标准流流标准流 文件指针文件的打开与关闭 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 为什么使用文件 我们程序运行的数据是运行在内存中的&#xff0c;当成程序…

在线课堂知识付费小程序源码系统 带完整的安装代码包以及搭建教程

系统概述 在线课堂知识付费小程序源码系统是基于当前主流技术栈开发的&#xff0c;支持微信小程序端的在线教育平台解决方案。它不仅包含了课程发布、在线学习、支付系统等基础功能&#xff0c;还融入了社区互动、用户管理、数据分析等高级特性&#xff0c;旨在打造一个全方位…

filezilla-server 1.8.1 设置

filezilla-server 1.8.1 设置&#xff1a; 1. 2. 3. 4. 其他不用配置&#xff0c; 5. 6. 7. 8. 9. 如果外网连不上 filezilla-server 提示无法连接到服务器&#xff0c; 多半是 filezilla-server 所在的电脑没有通过防火墙允许&#xff0c;打开 Windows defender 防…

万兴优转 v15 解锁版安装教程(全能音视频格式转换器)

前言 Wondershare UniConverter&#xff08;万兴优转&#xff09;国产全能音视频格式转换器。万兴格式转换器具有音视频格式转换、合并视频、视频压缩、视频编辑、视频录制、下载视频、元数据修复、VR视频转换、字幕编辑器、GIF制作、DVD刻录等一站式视频工具箱功能。万兴转换…

从文本文件中读取博客数据并将其提取到文件中

通常情况下我们可以使用 Python 中的文件操作来实现这个任务。下面是一个简单的示例&#xff0c;演示了如何从一个文本文件中读取博客数据&#xff0c;并将其提取到另一个文件中。 假设你的博客数据文件&#xff08;例如 blog_data.txt&#xff09;的格式 1、问题背景 我们需…