【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.hqwc.cn/news/705285.html

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

相关文章

janus源码分析(1)--代码结构整理

基础说明 janus官网 https://janus.conf.meetecho.com/index.html janus源码地址 https://github.com/meetecho/janus-gateway 编译及部署参考 https://pro-hnb.blog.csdn.net/article/details/137730389?spm1001.2014.3001.5502 https://pro-hnb.blog.csdn.net/article/deta…

java代码混淆工具ProGuard混淆插件

java代码混淆工具ProGuard混淆插件 介绍 ProGuard是一个纯java编写的混淆工具,有客户端跟jar包两种使用方式。可以将程序打包为jar,然后用工具进行混淆,也可以在maven中导入ProGuard的插件,对代码进行混淆。 大家都知道 java代…

Pencils Protocol 获合作伙伴 Galxe 投资,加快了生态进展

近日,Scroll 生态项目 Penpad 将品牌进一步升级为 Pencils Protocol,全新升级后其不仅对 LaunchPad 平台进行了功能上的升级,同时其也进一步引入了 Staking、Vault 以及 Shop 等玩法,这也让 Pencils Protocol 的叙事方向不再仅限于…

小程序(四)

十四、分包加载 (一)普通分包与主包 随着项目越来越大,为了用户更好的体验,小程序引用了分包技术,分包技术将tabBar页面及一些全局使用的静态资源,放到主包中,开发者可以根据需要添加分包&…

php+vant van-uploader手机拍照 上传

设置capture”user”&#xff0c;则只会调起摄像头&#xff1b; 不设置capture“user”&#xff0c;则会弹窗让选择相册或拍照。 HTML: <link rel"stylesheet" href"/vue/vant.css"><van-field name"uploader" label"照片"&…

关于 vs2019 c++20 规范里的一个全局函数 _Test_callable

&#xff08;1&#xff09;看名思议&#xff0c;觉得这个函数可以测试其形参是否是可以被调用的函数&#xff0c;或可调用对象&#xff1f; 不&#xff0c;这个名字不科学。有误导&#xff0c;故特别列出。看下其源码&#xff08;该函数位于 头文件&#xff09;&#xff1a; 辅…

使用可接受gitlab参数的插件配置webhook

jenkins配置 安装Generic Webhook Trigger 配置远程触发令牌 勾选Print post content和Print contributed variables用于打印值 配置gitlab 选择新增webhook 配置webhook http://JENKINS_URL/generic-webhook-trigger/invoke,将JENKINS_URL修改成自己的jenkins地址 先保存…

基于springboot+vue+Mysql的校园闲置物品交易网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

AWS简介

AWS AWS&#xff0c;全称为Amazon Web Services&#xff0c;是亚马逊公司旗下的云计算服务平台&#xff0c;自2006年起向全球用户提供广泛而深入的云计算服务。AWS是全球最全面、应用最广泛的云平台之一&#xff0c;它从全球的数据中心提供超过200项功能齐全的服务&#xff0c…

分布式系统的一致性与共识算法(三)

顺序一致性(Sequential Consistency) ZooKeeper 一种说法是ZooKeeper是最终一致性&#xff0c;因为由于多副本、以及保证大多数成功的ZAB协议&#xff0c;当一个客户端进程写入一个新值&#xff0c;另外一个客户端进程不能保证马上就能读到这个值&#xff0c;但是能保证最终能…

mysql的explain

explain可以用于select&#xff0c;delete&#xff0c;insert&#xff0c;update的statement。 当explain用于statement时&#xff0c;mysql将会给出其优化器&#xff08;optimizer&#xff09;的执行计划。 通过explain字段生成执行计划表。下面来解析这个执行计划表的每一列…

【以规划为导向的自动驾驶】Planning-oriented Autonomous Driving

ABSTRACT 研究背景&#xff1a; 现代自动驾驶系统是顺序化地排列多个任务模块, 近期的主流方法&#xff1a; ①为单个任务部署独立模型 ②设计具有分离式头部的多任务(multi-task)范式。 但是&#xff0c;这些方法会累积误差或任务间协同不足而不利于自动驾驶。 作者认为重…