当前位置: 首页 > news >正文

Spring系统学习 - Bean的作用域

bean作用域介绍

Spring框架提供了不同的作用域来管理Bean的生命周期和可见性,这对于控制不同类型的组件和处理并发请求尤其重要。

  • singleton(默认)

    • 每个Spring IoC容器只有一个bean实例。
    • 当容器创建bean后,它会被缓存起来,后续请求将返回同一个实例。
    • 这是默认的作用域,适用于无状态的服务层bean。
  • prototype

    • 每次请求都会创建一个新的bean实例。
    • 每当客户端请求该bean时,Spring容器都会创建一个新的实例。
    • 这对于那些需要保持独立状态的bean特别有用,比如基于注解的控制器。
  • request

    • 每个HTTP请求都有其自己的bean实例。
    • 主要用于Web应用,确保每个HTTP请求都有一个新的bean实例。
    • 这对于有状态的会话bean特别有用。
  • session

    • 在同一个HTTP Session中,每个Session拥有一个bean实例。
    • 这意味着在用户会话期间,bean实例是共享的。
    • 对于需要在整个会话期间保存状态的bean,这是理想的选择。
  • global-session

    • 类似于session作用域,但专门用于portlet应用中的全局会话。
    • 在portlet应用中,全局会话是跨所有portlet的会话范围。
  • application

    • 这个作用域在Web应用中提供一个bean实例,类似于Servlet的application作用域。
    • bean在整个Web应用的生命周期内存在,即从应用启动到停止

除了这些内置作用域,Spring还允许你定义自定义作用域,这通常通过实现org.springframework.beans.factory.config.Scope接口来完成。自定义作用域可以让你根据特定的应用需求来管理bean的生命周期。

常用的

取值含义创建对象的时机
singleton(默认)在IOC容器中,这个bean的对象始终为单实例IOC容器初始化时
prototype这个bean在IOC容器中有多个实例获取bean时

案例演示

public class User {private Integer id;private String username;private String password;private Integer age;public User() {System.out.println("生命周期:1、创建对象");}public User(Integer id, String username, String password, Integer age) {this.id = id;this.username = username;this.password = password;this.age = age;}public Integer getId() {return id;}public void setId(Integer id) {System.out.println("生命周期:2、依赖注入");this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public void initMethod(){System.out.println("生命周期:3、初始化");}public void destroyMethod(){System.out.println("生命周期:5、销毁");}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +'}';}}

我们创建一个spring-scope.xml演示作用域

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- scope属性:取值singleton(默认值),bean在IOC容器中只有一个实例,IOC容器初始化时创建
对象 --><!-- scope属性:取值prototype,bean在IOC容器中可以有多个实例,getBean()时创建对象 --><bean id="studentOne" class="com.miaow.spring.bean.Student" scope="prototype"><property name="id" value="1"></property><property name="name" value="miaow"></property><property name="address" value="湖南娄底"></property><property name="birthday" value="1999"></property><property name="email" value="2958467385@qq.com"></property><property name="phone" value="15975145237"></property><property name="school" value="知行合一"></property><property name="sex"><value></value></property></bean>
</beans>

Java测试代码

@Test
public void ScopeTest(){ApplicationContext context = new ClassPathXmlApplicationContext("spring-scope.xml");Student student = (Student) context.getBean("studentOne");Student student1 = (Student) context.getBean("studentOne");System.out.println(student == student1);
}

在这里插入图片描述
在上述代码中,我们需要注意的是,xml配置文件中的singleton和prototype,当我们配置singleton的时候你试一下结果如何,我给出prototype的时候的结果如下图所示:
在这里插入图片描述

  • 注意线程安全性:如果Bean是有状态的,并且在多线程环境中使用,需要确保Bean的线程安全性。在多线程环境中,最好使用原型作用域或每次请求创建新的Bean实例

  • 注意内存消耗:使用原型作用域时,需要注意内存消耗。如果原型Bean被频繁创建,可能会导致内存占用过高。在这种情况下,可以考虑使用对象池或其他缓存机制来管理Bean的创建和销毁。

  • 注意作用域的选择:根据应用程序的需求,选择适当的作用域。如果Bean的状态不会改变,并且需要在整个应用程序中共享,可以使用单例作用域。如果需要每次请求或会话创建新的实例,可以使用请求或会话作用域

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 震坤行坤合供应链荣获“2024 LOG低碳供应链物流-最具影响力品牌商”
  • 快捷键专栏 IDEA、Navicat、电脑、Excle、Word等
  • SpringCash
  • Java--数组小结
  • 【Spine学习06】之IK约束绑定,制作人物待机动画,图表塞贝尔曲线优化动作
  • Java之等待唤醒方法
  • 如何成为一名黑客?小白必学的12个基本步骤
  • 【设计模式之组合模式 -- C++】
  • 在项目中使用Volta控制node版本
  • 【css】html 标初始化CSS样式(初学者必看)
  • VUE之重定向redirect
  • flutter 导出iOS问题3
  • PyTorch 统计属性-Tensor基本操作
  • ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的MPAM
  • android 异屏同显二.
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • canvas绘制圆角头像
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS 系统授权开发
  • jquery ajax学习笔记
  • js学习笔记
  • laravel with 查询列表限制条数
  • php ci框架整合银盛支付
  • Puppeteer:浏览器控制器
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • 翻译--Thinking in React
  • 力扣(LeetCode)56
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 译自由幺半群
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # dbt source dbt source freshness命令详解
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #systemverilog# 之 event region 和 timeslot 仿真调度(十)高层次视角看仿真调度事件的发生
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (C++17) optional的使用
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (MATLAB)第五章-矩阵运算
  • (备份) esp32 GPIO
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)appium-desktop定位元素原理
  • (一)基于IDEA的JAVA基础12
  • (一)认识微服务
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .form文件_SSM框架文件上传篇
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET 回调、接口回调、 委托
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池