JavaEE7-Bean的作用域

news2024/9/21 11:09:22

目录

1.作用域定义

2.Bean的6种作用域

2.1.singleton:单例作用域(默认作用域)

2.2.prototype:原型作用域(多例作用域)

2.3.request:请求作用域

2.4.session:会话作用域

2.5.application:全局作用域(了解)

2.6.websocket:HTTP WebSocket作用域(了解)

3.设置作用域

3.1.直接设置值:@Scope("prototype")

3.2.使用枚举设置(推荐,不易出错):@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)


1.作用域定义

限定程序中变量的可用范围叫做作用域,或者说在源代码中定义变量的某个区域就叫做作用域。

而Bean的作用域是指Bean在Spring整个框架中的某种行为模式

2.Bean的6种作用域

Spring容器在初始化一个Bean的实例时,同时会指定该实例的作用域。

在Spring Core普通项目中:

2.1.singleton:单例作用域(默认作用域)

  • 描述:在整个应用程序级别,该作用域下的Bean在IoC容器中只存在一个实例,是全局共享的:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是同一个对象(内存地址相等)。当某人修改了这个值之后,另一个人读取到的就是被修改的值。
  • 场景:通常无状态的Bean使用该作用域。无状态表示Bean对象的属性状态不需要更新。只读不写。
  • 备注:使用单例可以很大程度上提高性能,Spring默认选择该作用域。作用于IoC容器。

案例:现有一个公共的Bean提供A和B用户使用,使用途中A用户悄悄修改了公共Bean数据,导致B用户在使用时发生了预期之外的逻辑错误。

公共Bean:

import com.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}

A用户使用时进行了修改操作:

import com.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class BeanScopesController1 {
    @Autowired
    private User user1;

    public User getUser1() {
        User user = user1;
        System.out.println("Bean原name:" + user.getName());
        user.setName("悟空");
        return user;
    }
}

B用户再去使用公共Bean的时候:

import com.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class BeanScopesController2 {
    @Autowired
    private User user1;

    public User getUser1() {
        User user = user1;
        return user;
    }
}

打印A,B用户公共Bean的值:

import com.beans.BeanScopesController1;
import com.beans.BeanScopesController2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanScopesTest {
    public static void main(String[] args) {
        //1.获取Spring上下文
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2.得到bean
        BeanScopesController1 beanScopesController1 = context.getBean(BeanScopesController1.class);
        //3.使用bean
        System.out.println("A对象修改之后name:" + beanScopesController1.getUser1());

        BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
        System.out.println("B对象修改之后name:" + beanScopesController2.getUser1());
    }
}

2.2.prototype:原型作用域(多例作用域)

  • 描述每次对该作用域下的Bean的访问都会创建新的实例:获取Bean(即通过applicationContext.getBean等方法获取)及装配Bean(即通过@Autowired注入)都是新的对象实例。当某人修改了这个值之后,另一个人读取到的还是被修改前的值。
  • 场景:通常有状态的Bean使用该作用域。需要修改。

在Spring MVC项目中:

2.3.request:请求作用域

  • 描述每次http请求会创建新的Bean实例,类似于prototype。
  • 场景:一次http请求和响应的共享Bean。
  • 备注:限定Spring MVC中使用。

2.4.session:会话作用域

  • 描述:在一个http session中,定义一个Bean实例。
  • 场景:用户会话的共享Bean,比如:记录一个用户的登录信息。
  • 备注:限定Spring MVC中使用。

2.5.application:全局作用域(了解)

  • 描述:在一个http servlet Context中,定义一个Bean实例。
  • 场景:Web应用的上下文信息,比如:记录一个应用的共享信息。
  • 备注:限定Spring MVC中使用。作用于Servlet容器。

在Spring WebSocket项目中(也属于Spring MVC项目):

2.6.websocket:HTTP WebSocket作用域(了解)

  • 描述:在一个HTTP WebSocket的生命周期中(在一个服务器端和一个客户端之间的通讯中),定义一个Bean实例。
  • 场景:WebSocket的每次会话中,保存了一个Map结构的头信息,将用来包裹客户端消息头。第一次初始化后,直到WebSocket结束都是同一个Bean。
  • 备注:限定Spring WebSocket项目(通讯,应用级别,基于TCP/UDP,常作于网页版聊天)中使用。

3.设置作用域

使用@Scope(作用域)标签就可以用来声明Bean的作用域。

@Scope标签既能修饰方法也能修饰,在哪将一个对象存储到Spring中,就在哪加@Scope标签。(若在类上存对象,则@Scope加到类上;若在方法上存对象,则@Scope加到方法上。)

@Scope有2种设置方法:

3.1.直接设置值:@Scope("prototype")

3.2.使用枚举设置(推荐,不易出错):@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

import com.model.User;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
public class Users {
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean(name = "u1")
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Java");
        return user;
    }
}

 

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

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

相关文章

C++基础回顾

吼吼吼CC基础回顾C基础入门一、标识符1.1标识符命名规则二、数据类型2.1整形(格式:int 关键字)2.2 sizeof关键字2.3 float关键字2.4字符型2.5转义字符2.6字符串型2.7布尔类型2.8数据的输入三、运算符3.1算数运算符前置递增与后置递增区别3.2 …

MS Access数据库多数据源JDBC查询

Druid, C3P0都不支持微软的Access,如何实现多数据源JDBC查询?? 2023-01-23T23:54:52.4760800 WARNING com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask544a5904 -- Acquisition Attempt Failed!!! Clearing pending a…

Linux内核驱动初探(二) TI声卡

目录 0. 前言 1. menuconfig 2. 超时问题 3. 稳定性问题 0. 前言 通过查询该设备原理图可知,该声卡的Codec芯片型号为德州仪器 TLV320DAC3101。 1. menuconfig 我们在 linux-menuconfig 里面如下设置:进入 Device Drivers ---> Sound card supp…

准确率、精确率、召回率、F1-measure

文章目录准确率(Accuracy)精确率(precision)召回率(recall)F1-measure值学习理解网站-p’(Predicted)n’(Predicted)p(Actual)True PositiveFalse Negtiven(Actual)False PositiveTrue Negtive 准确率(Accuracy) ANo.Samples Predicted CorrectlyTotal No.of SamplesTPTNPN(1)A…

适配splashscreen步骤以及遇到的坑

Android 12 启动画面 从 Android 12 开始,在所有应用的冷启动和温启动期间,系统一律会应用 Android 系统的默认启动画面。默认情况下,此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground(如果是单色&#xff09…

虚函数的静态解析

目录 一.基类的constructor和destructor内 二.使用的是基类的对象而不是基类对象的pointer或reference 存在两种情况,虚函数机制不会出现预期行为: 即不根据虚函数的机制来调用类中对应的虚函数 示例中使用的基类和派生类: class base_cl…

vue事件车的原理与标准写法实现兄弟组件的传值

目录前言一,全局事件总线介绍1.1 原理介绍1.2 x需要满足的条件二,知识点的复习2.1 vc是什么2.2 vm管理vc如何体现2.3 原型2.4 上述知识的串联三,实现需求3.1 x的编写及讲解3.2 使用x四,标准写法4.1 写法改动4.2 销毁五 关键代码后…

有关BMP位图的分析

1、BMP是什么? BMP是 Bitmap(位图)的简称,是windows显示图片的基本格式。 在windows下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种各样格式的图片文件也都…

9.Java数组知识大全

文章目录前言一、数组介绍二、数组的定义域静态初始化三、数组元素访问数组地址中的小拓展:四、数组遍历1.获取数组里面的元素2.把数据存储到数组中3.遍历数组的最快方式4.遍历数组并求和5.统计个数6.变化数据五、数组动态初始化1.数组默认初始化值的规律2.数组动态初始化和静态…

单绞机控制算法模型(Simulink仿真)

线缆行业单绞机PLC控制算法详细解读可以参看下面的文章链接: 线缆行业单绞机控制算法(详细图解+代码)_RXXW_Dor的博客-CSDN博客在了解单绞机之前需要大家对收放卷以及排线控制有一定的了解,不清楚的可以参看下面几篇博客,这里不再赘述,受水平和能力所限,文中难免出现错…

【JavaEE】认识线程Thread类及常用方法线程状态

目录 一:认识线程: 二、线程的优点: 三、进程和线程的区别(面试题): 四、第一个多线程程序: 五、创建线程的方式: 六、Thread类及常用方法 Thread类常见构造方法&#xff1…

整理介绍字符函数和字符串函数+内存函数

本篇重点介绍处理字符和字符串的库函数的使用和注意事项 本篇重点本篇重点介绍处理字符和字符串的库函数的使用和注意事项前言:求字符串长度strlen拷贝字符串函数strcpy(追加)连接字符串函数strcat比较两个字符串函数strcmp对上面改进字符串函…

Mac应用程序无法打开或文件损坏的处理方法

很多用户在安装 盗版 Mac软件的时候,经常会遇到提示“xxx.app已损坏,打不开。您应该将它移到废纸篓“或”打不开的xxx.app,因为它来自身份不明的开发者”,等多种打不开盗版软件的各种提示,正版软件则不会出现。 错误截…

17种编程语言实现排序算法-基数排序

开源地址 https://gitee.com/lblbc/simple-works/tree/master/sort/ 覆盖语言:C、C、C#、Java、Kotlin、Dart、Go、JavaScript(JS)、TypeScript(TS)、ArkTS、swift、PHP。 覆盖平台:安卓(Java、Kotlin)、iOS(SwiftUI)、Flutter(Dart)、Window桌面(C#)、…

事件冒泡和时间捕获

事件冒泡和事件捕获 最近,在复习Vue的时候,发现自己对于事件冒泡和事件捕获的理解存在一定的错误。于是想写一份笔记来总结一下事件冒泡和事件捕获。✌✌✌ 一、事件 1、事件的三个阶段:事件捕获->事件目标->事件冒泡 捕获阶段&am…

MySQL 性能优化浅析及线上案例

作者:京东健康 孟飞 1、 数据库性能优化的意义 业务发展初期,数据库中量一般都不高,也不太容易出一些性能问题或者出的问题也不大,但是当数据库的量级达到一定规模之后,如果缺失有效的预警、监控、处理等手段则会对用户…

设计模式学习(十二):Decorator装饰器模式

一、什么是Decorator模式假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕。如果加上草莓,就是草莓奶油蛋糕。如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛…

JavaEE5-Spring更简单的读取和存储对象

目录 1.存储Bean对象 1.1.前置工作:在配置文件中设置bean扫描的根路径(重要) 1.2.添加注解存储Bean对象到Spring中 1.2.1.类注解(添加到某个类上,将当前的类存储到Spring中):Controller,Service&#x…

树,堆,二叉树的认识

1.树概念及结构 1.1树的概念 注意:树形结构中,子树之间不能有交集,否则就不是树形结构 1.2 树的相关概念 1.3 树的表示 树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存…

Gateway服务网关

Gateway服务网关一、网关介绍二、gateway快速入门1.创建gateway服务,引入依赖2.编写启动类3.编写基础配置和路由规则4.重启测试5.网关路由的流程图三、断言工厂四、过滤器工厂1.路由过滤器的种类2.请求头过滤器3.默认过滤器4.总结五、全局过滤器1.全局过滤器作用2.自…