【JavaEE进阶】 Bean的作用域与生命周期

文章目录

  • 🍃Bean的作用域
    • 🚩作用域的使用
    • 🚩观察Bean的作用域
      • 🎈单例作用域
      • 🎈多例作用域
      • 🎈请求作用域
      • 🎈会话作⽤域
      • 🎈Application作⽤域
  • 🎄Bean的⽣命周期
  • ⭕总结

🍃Bean的作用域

Bean的作⽤域是指Bean在Spring框架中的某种⾏为模式.

比如单例作⽤域:表⽰ Bean 在整个Spring 中只有⼀份, 它是全局共享的.那么当其他⼈修改了这个值之后,那么另⼀个⼈读取到的就是被修改的值.

在Spring中⽀持6种作⽤域,后4种在Spring MVC环境才⽣效

  1. singleton:单例作⽤域

  2. prototype:原型作⽤域(多例作⽤域)

  3. request:请求作⽤域

  4. session:会话作⽤域

  5. Application: 全局作⽤域

  6. websocket:HTTP WebSocket 作⽤域

作⽤域说明
singleton每个Spring IoC容器内同名称的bean只有⼀个实例(单例)(默认)
prototype每次使⽤该bean时会创建新的实例(⾮单例)
request每个HTTP 请求⽣命周期内,创建新的实例(web环境中)
session每个HTTP Session⽣命周期内,创建新的实例(web环境中)
application每个ServletContext⽣命周期内,创建新的实例(web环境中)
websocket每个WebSocket⽣命周期内,创建新的实例(web环境中)

🚩作用域的使用

简单使用如下:

首先我们准备一个 Dog 类如下:

public class Dog {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}

接下来我们定义几个不同作用域的 Bean

@Component
public class DogBean {@Beanpublic Dog dog() {Dog dog = new Dog();dog.setName("旺财");return dog;}@Bean@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)public Dog singleDog(){Dog dog = new Dog();return dog;}@Bean@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public Dog prototypeDog(){Dog dog = new Dog();return dog;}@Bean@RequestScopepublic Dog requestDog() {Dog dog = new Dog();return dog;}@Bean@SessionScopepublic Dog sessionDog() {Dog dog = new Dog();return dog;}@Bean@ApplicationScopepublic Dog applicationDog() {Dog dog = new Dog();return dog;}
}

需要注意的是

@RequestScope 等同于
@Scope(value =WebApplicationContext.SCOPE_REQUEST, proxyMode=ScopedProxyMode.TARGET_CLASS)

@SessionScope 等同于
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode=ScopedProxyMode.TARGET_CLASS)

@ApplicationScope 等同于 @Scope(value=WebApplicationContext.SCOPE_APPLICATION,proxyMode=ScopedProxyMode.TARGET_CLASS)

proxyMode⽤来为springbean设置代理.

proxyMode = ScopedProxyMode.TARGET_CLASS

表⽰这个Bean基于CGLIB实现动态代理.

Request,session和application作⽤域的Bean需要设置proxyMode

接下来我们再写一些程序进行测试,测试不同作⽤域的Bean取到的对象是否⼀样,测试程序如下:

@RestController
public class DogController {@Autowiredprivate Dog singleDog;@Autowiredprivate Dog prototypeDog;@Autowiredprivate Dog requestDog;@Autowiredprivate Dog sessionDog;@Autowiredprivate Dog applicationDog;@Autowiredprivate ApplicationContext applicationContext;@RequestMapping("/single")public String single(){Dog contextDog = (Dog)applicationContext.getBean("singleDog");return "dog:"+singleDog.toString()+"|-- --|contextDog:"+contextDog;}@RequestMapping("/prototype")public String prototype(){Dog contextDog = (Dog)applicationContext.getBean("prototypeDog");return "dog:"+prototypeDog.toString()+"|-- --|contextDog:"+contextDog;}@RequestMapping("/request")public String request(){Dog contextDog = (Dog)applicationContext.getBean("requestDog");return"dog:"+requestDog.toString()+"|-- --|contextDog:"+contextDog.toString();}@RequestMapping("/session")public String session(){Dog contextDog = (Dog)applicationContext.getBean("sessionDog");return "dog:"+sessionDog.toString()+"|-- --|contextDog:"+contextDog.toString();}@RequestMapping("/application")public String application(){Dog contextDog = (Dog)applicationContext.getBean("applicationDog");return "dog:"+applicationDog.toString()+"|-- --|contextDog:"+contextDog.toString();}
}

🚩观察Bean的作用域

接下来我们来进行访问

🎈单例作用域

  • http://127.0.0.1:8080/single

多次访问,得到的都是同⼀个对象,并且 @Autowired 和applicationContext.getBean() 也是同⼀个对象.

在这里插入图片描述

🎈多例作用域

  • http://127.0.0.1:8080/prototype

观察ContextDog,每次获取的对象都不⼀样(注⼊的对象在Spring容器启动时,就已经注⼊了,所以多次请求也不会发⽣变化)
在这里插入图片描述

🎈请求作用域

  • http://127.0.0.1:8080/request

在⼀次请求中, @Autowired 和 applicationContext.getBean() 也是同⼀个对象.但是每次请求,都会重新创建对象

在这里插入图片描述

🎈会话作⽤域

  • http://127.0.0.1:8080/session

在⼀个session中,多次请求,获取到的对象都是同⼀个.
在这里插入图片描述

换⼀个浏览器访问,发现会重新创建对象.(另⼀个Session)

在这里插入图片描述

🎈Application作⽤域

  • http://127.0.0.1:8080/application

在⼀个应⽤中,多次访问都是同⼀个对象
在这里插入图片描述

Application scope就是对于整个web容器来说,bean的作⽤域是ServletContext级别的.

这个和singleton有点类似,区别在于:Application scope是ServletContext的单例,singleton是⼀个ApplicationContext的单例.

在⼀个web容器中ApplicationContext可以有多个

🎄Bean的⽣命周期

⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期.
Bean的⽣命周期分为以下5个部分:

  1. 实例化(为Bean分配内存空间)
  2. 属性赋值(Bean注⼊和装配,⽐如 @AutoWired )
  3. 初始化
    • 执⾏各种通知,如 BeanNameAware ,BeanFactoryAware ,ApplicationContextAware 的接⼝⽅法.
    • 执⾏初始化⽅法
      • xml定义 init-method
      • 使⽤注解的⽅式 @PostConstruct
      • 执⾏初始化后置⽅法( BeanPostProcessor )
  4. 使⽤Bean
  5. 销毁Bean
    • 销毁容器的各种⽅法,如 @PreDestroy , DisposableBean 接⼝⽅法, destroymethod.

实例化和属性赋值对应构造⽅法和setter⽅法的注入.

初始化和销毁是用户能⾃定义扩展的两个阶段,可以在实例化之后,类加载完成之前进⾏⾃定义"事件"处理.

⽐如我们现在需要买⼀栋房⼦,那么我们的流程是这样的:

  1. 先买房(实例化,从⽆到有)
  2. 装修(设置属性)
  3. 买家电,如洗⾐机,冰箱,电视,空调等([各种]初始化,可以⼊住);
  4. ⼊住(使⽤Bean)
  5. 卖房(Bean销毁)

执行流程如下图所示:
在这里插入图片描述

⭕总结

关于《【JavaEE进阶】 Bean的作用域与生命周期》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

win11家庭中文版安装docker,报错 Docker Engine stopped

先引一下这位博主的链接超详细Windows11家庭中文版系统安装Docker-20230401_windows11安装docker-CSDN博客,我到前五步(跳出页面重启)和博主都是一样的,但是第六步我并没有报错,直接跳出docker界面 记录一下我的解决办法,首先按照…

金价又双叒涨了!现货黄金什么比较好

虽然近期有新闻显示,国内的实物黄金价格出现大幅的下跌,但是从整体看,多个黄金投资品种的长期上升趋势还是比较稳定的,因此我们会看到,很多投资者会趁现在这波下跌重新入场做多。那么投资黄金买什么比较好呢&#xff1…

如何向全国各大新闻网站投稿?

在信息爆炸的时代,新闻媒体的投稿工作对于单位的信息宣传员来说,既是一项重要的职责,也是一项充满挑战的任务。作为一名信息宣传员,我负责着单位的对外信息宣传投稿工作,每个月都需要在各大媒体上发表文章,以展示单位的成果和风采。 然而,刚开始的投稿之路并不顺畅。我习惯性地…

4种企业防泄密的办法,强烈推荐第二种

4种企业防泄密的办法,强烈推荐第二种 企业信息泄密常见的原因有内部人员、黑客、违规收集信息、第三方合作商,以下将为你详细分析这些泄密原因以及应对的方法。 1、内部人员泄密 内部员工由于能够接触到敏感数据,成为主要的泄露数据群体。这…

2024最新洗地机推荐,洗地机怎么选?热门品牌哪个最好用?

在现代生活中,忙碌的日常让家庭清洁变得更加繁重和耗时。然而,洗地机的引入彻底改变了这一状况。凭借其强大的清洁效果和简便的使用方式,洗地机能够迅速清除地面上的各种污垢,使清洁工作变得轻松自如。正因为如此,洗地…

JWT生成token工具类实现

JWT简介 JWT定义 JWT全称为Json web token,也就是 Json 格式的 web token JWT数据结构 1.JWT由三段字符串组成,中间用.分隔 Project_eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNzE2MzcwMTM0LCJpYXQiOjE3MTU3NjUzMzQsImp0aSI6IjllO…

力扣HOT100 - 152. 乘积最大子数组

解题思路&#xff1a; 方法一&#xff1a;暴力 class Solution {public int maxProduct(int[] nums) {int max Integer.MIN_VALUE;int s 1;for (int i 0; i < nums.length; i) {s 1;for (int j i ; j < nums.length; j) {s * nums[j];max Math.max(max, s);}}ret…

出国旅游常用英语,柯桥成人英语培训

Where can I catch a taxi?哪里我可以叫到出租车&#xff1f; The taxi zone is right on the left corner over there.出租车站台就在左边转角处。 Are you free?您有空吗&#xff1f; Sure. Where are you going?当然。您要去哪里&#xff1f; Drive me back to Santa …

#Docker | Ngrok# 使用Ngrok和Docker进行内网穿透

一、注册 Ngrok官网注册&#xff0c;可以使用gmail或者outlook邮箱&#xff0c; 正常填写后你会收到一封电子邮件&#xff0c;点击邮件中链接即注册成功 二、获取密钥 登录&#xff0c;点击Your Authtoken&#xff0c;最上面copy左边就是你得密钥 三、使用内网穿透启动docker…

c++20---std::erase----std::erase_if

问题&#xff1a;如何删除满足条件的所有元素。 erase #include <iostream> #include <algorithm> #include <vector>int main(){std::vector<int> vec{1,2,3,1,1,1,1,1};std::erase(vec,1);for(int v:vec) std::cout<<v<<" "…

与禹老师学前端vue3学习汇总

24.5.15&#xff1a; 创建Vue3工程 1.确定自己电脑有没有nodejs环境&#xff0c;在cmd中输入node&#xff0c;如果出现Node.js的版本号说明已经有这个环境了&#xff0c;否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study&#xff0c;然后在这个空文件夹中右键选择终端…

首次曝光!我喂了半年主食冻干,喵状态真滴顶~

科学养猫理念的推广&#xff0c;使得主食冻干喂养越来越受到养猫者的欢迎。主食冻干不仅符合猫咪的自然饮食习惯&#xff0c;还能提供丰富的营养&#xff0c;有助于保持猫咪的口腔和消化系统健康。我家喂了半年主食冻干&#xff0c;猫咪的状态是真的不一样了&#xff01; 然而…

五丰黎红引领新营销模式:布局一物一码数字化营销,提高调味品销量和复购率

调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a;3&#xff1a;1&#xff0c;餐饮行业是调味品行业的供需主力。在餐饮行业中&#xff0c;“大厨”这一角色具有十分重要的地位。因此&#xff0c;借助大厨的力量成为了许多调味品…

回文数[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个整数x&#xff0c;如果x是一个回文整数&#xff0c;返回true&#xff1b;否则返回false。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。例如&#xff0c;121是…

洛谷P1364 医院设置

P1364 医院设置 题目描述 设有一棵二叉树&#xff0c;如图&#xff1a; 其中&#xff0c;圈中的数字表示结点中居民的人口。圈边上数字表示结点编号&#xff0c;现在要求在某个结点上建立一个医院&#xff0c;使所有居民所走的路程之和为最小&#xff0c;同时约定&#xff0c…

单元测试—BMI脚本设计

BMI例题如下&#xff1a; BMI中国计算标准&#xff1a;体质指数&#xff08;BMI&#xff09;体重&#xff08;kg&#xff09;身高^2&#xff08;m&#xff09; 例如&#xff1a;一个人的身高为1.75米,体重为68千克&#xff0c;他的BMI68/(1.75^2)22.2&#xff08;千克/米^2&a…

每日5题Day3 - LeetCode 11 - 15

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxArea(int[] height) {//这道题比较特殊&#xff0c;因为两边是任意…

04、SpringBoot 源码分析 - SpringApplication启动流程四

SpringBoot 源码分析 - SpringApplication启动流程四 初始化基本流程SimpleApplicationEventMulticaster的multicastEvent广播事件resolveDefaultEventType获取ResolvableType实例ResolvableType的forInstance创建ResolvableType实例 开始广播AbstractApplicationEventMulticas…

脉冲水路清洗机,全自动脉冲技术清除管道堵塞

邦注脉冲水路清洗机是一种高效的清洗设备&#xff0c;它利用全自动脉冲技术来清除管道内的堵塞和污垢。以下是对该设备的一些详细描述&#xff1a; 全自动脉冲技术&#xff1a;脉冲水路清洗机采用了全自动脉冲技术&#xff0c;这是一种先进的清洗方法。该技术通过产生高强度的…

window10下安装ubuntu系统以及docker使用

window10下安装ubuntu系统以及docker使用 1. 启用适用于Linux的Windwos子系统2.下载Linux内核更新包3.将 WSL 2 设置为默认版本4.安装Ubuntu<br />直接去Microsoft store里面直接搜索Ubuntu进行安装。5.可能出现的问题1.win10启动ubuntu报错 参考的对象类型不支持尝试的操…