04、IoCContainer-4 Bean作用域(Bean Scopes)

Screenshot_2026-11-04-16-26-45-46.jpg 立即下载

Bean作用域(Bean Scopes)

  1. Spring总的6种作用域

    作用域描述
    singleton(默认作用域)在每个Spring容器中,一个bean定义只有一个对象实例
    prototype一个bean定义可以有任意多个对象实例
    request在一次HTTP请求中,一个bean定义对应一个对象实例。该作用域只在基于Web的Spring上下文中有效
    session在一个HTTP Session 中,一个bean定义对应一个对象实例。该作用域只在基于Web的Spring上下文中有效
    application在一个ServeletContext中,一个bean定义对应一个对象实例。该作用域只在基于Web的Spring上下文中有效
    websocket在一个Websocket中,一个bean定义对应一个对象实例。该作用域只在基于Web的Spring上下文中有效
  2. Singleton Scope

    如果一个bean被定义为singleton,那么这个bean被实例化后存储在一个singletonbean缓存中,接下来所有对该bean名称的请求或者引用,容器都会返回那个存储在缓存中的实例。

     
    5893832-6f279c1e36809ef8.png
    Singleton Scope的工作模式

     

    我们可以像如下这样定义singletonbean:

     <bean id="accountService" class="com.something.DefaultAccountService"/>
    
     <!-- the following is equivalent, though redundant (singleton scope is the default) -->
     <bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
    
  3. Prototype Scope

    对于prototype scope的bean来说,每一次对该bean的请求,容器都将创建一个新的实例。

    为无状态bean使用singleton scope,为有状态bean使用prototype scope。

    无状态bean:没有实例域的对象,不会有状态的改变。

    有状态bean:有实例域的对象,这些实例域是线程不安全的,所以每次使用都应该创建新的实例。

     
    5893832-13c9788e5cbd3ca0.png

    下面定义了一个prototype scopebean

    <bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
    

    同其它的作用域不同,Spring不会在prototypebean的整个生命周期都管理整个bean,在容器实例化、配置和装配整个bean后,就将这个bean交给了客户端,不会记录这个实例域。
    所以,prototypebean的摧毁生命周期回调方法无法被调用,客户端应该负责 清除这个实例并释放它锁占有的资源。可以使用org.springframework.beans.factory.config.BeanPostProcessor接口来实现资源的释放。

  4. Rquest、Session、Application,and WebSocket Scopes

    这几中作用域只在基于Web的Spring上下文中有效,如果在一个普通的Spring上下文中(如ClassPathXmlApplicationContext),使用这些作用域,将会抛出IllegalStateExcetion。

    • 4.1 Web初始配置

      完成Web初始设置需要取决于我们使用的Servlet环境。

      • 如果我们访问的bean是在Spring Web MVC 中(事实上是在被SpringDespatcherServlet处理的一次请求中),那么就不需要做任何特殊的设置,DespatcherServlet已经暴露了所有相关的内容。
      • 如果我们使用的是Servlet 2.5 web容器,且请求不被Spring的DespatcherServlet处理,那么我们需要注册org.springframework.web.context.request.RequestContextListener ServletRequestListener.
        对于Servlet 3.0+ web容器,注册ServletRequestListener可以通过实现WebApplicationInitializer接口来编程实现。不然像老的容器一样,在web.xml文件中进行注册:
       <web-app>
         ...
         <listener>
             <listener-class>
                 org.springframework.web.context.request.RequestContextListener
             </listener-class>
         </listener>
         ...
       </web-app>
      
      • 另外,如果我们的监听器设置有问题的话,考虑使用RequestContextFilter。过滤器的映射取决于我们的web应用配置,所以filter-mapping应该设置成合适的值,下面是一个web应用的过滤器部分:
      <web-app>
          ...
          <filter>
              <filter-name>requestContextFilter</filter-name>
              <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
          </filter>
          <filter-mapping>
              <filter-name>requestContextFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
          ...
      </web-app>
      

      DespatcherServlet、RequestContextListener和RequestContextFilter事实上作用相同,就是将HTTP请求对象绑定到响应这个请求的线程上。

    • 4.2 Request Scope

      <bean id="loginAction" class="com.something.LoginAction" scope="request"/>
      

      上面定义了一个request作用域的bean,这个bean的实例在每一次HTTP请求这个对象时都会被创建一次,我们可以修改实例的状态,因为每一个实例都是独立的属于某一次请求的。当请求处理完成后,对应的实例就会被丢弃。

      基于注解的配置中,使用@RequestScope,指定一个组件(Component)的作用域为request:

      @RequestScope
      @Component
      public class LoginAction {
         // ...
      }
      
    • 4.3 Session Scope

      <bean id="userPreferences" class="com.something.UserPreferences" scope="session"/>
      

      上面定义了一个session作用域的bean,这个bean的实例在每一次建立HTTP会话时这个对象时都会被创建一次,我们可以修改实例的状态,因为每一个实例都是独立的属于某一次会话的。当会话结束后,实例就会被丢弃。

      基于注解的配置中,使用@SessionScope,指定一个组件(Component)的作用域为session:

      @SessionScope
      @Component
      public class UserPreferences {
          // ...
      }
      
    • 4.4 Application Scope

      <bean id="appPreferences" class="com.something.AppPreferences" scope="application"/>
      

      容器为整个web应用创建一个AppPreferencesbean实例。这意味着appPreferencesbean作用域在ServletContext层,当成ServletContext的属性被存储。这有点像Spring的单例bean,但有两点不同:
      一是,appPreferencesbean在每个ServletContext中是单例,而不是在每个ApplicationContext中;二是appPreferencesbean被当做ServletContext的属性而暴露出来。

      基于注解的配置中,使用@ApplicationScope,指定一个组件(Component)的作用域为application:

      @ApplicationScope
      @Component
      public class AppPreferences {
          // ...
      }
      
    • 4.5 有作用域的bean作为依赖

      如果我们想将一个(比如)request作用域bean注入到一个有更长生命周期作用域的bean中时,我们应该使用AOP代理来替换这个bean。我们将与目标bean具有相同接口的代理对象注入,但是这个代理对象也可以从相关作用域检索真正的目标对象,并将方法调用委托给真正的对象。

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/aop
              https://www.springframework.org/schema/aop/spring-aop.xsd">
      
          <!-- an HTTP Session-scoped bean exposed as a proxy -->
          <bean id="userPreferences" class="com.something.UserPreferences" scope="session">
              <!-- instructs the container to proxy the surrounding bean -->
              <aop:scoped-proxy/>
          </bean>
      
          <!-- a singleton-scoped bean injected with a proxy to the above bean -->
          <bean id="userService" class="com.something.SimpleUserService">
              <!-- a reference to the proxied userPreferences bean -->
              <property name="userPreferences" ref="userPreferences"/>
          </bean>
      </beans>
      

      在上面的配置中,singleton-scopedbeanuserService注入了一个session-scopedbean userPreferences。userService只在容器初始化时被实例化一次,这意味着它的依赖注入也只会在容器初始化时进行。而它所依赖的userPreferences在每一个HTTP Session中都会被实例化。所以,我们需要将com.something.UserPreferences的代理类注入userService。

      • 容器在初始化时创建userServicebean,并创建一个UserPreferences的代理类,将其注入userService.
      • 当userService实例调用userPreferences方法时,它其实调用的是UserPreferences代理类对象的方法,这个方法从HTTP Session 中取到真正的UserPreferences对象实例,然后将方法的调用委托给真正对象。
    • 4.6 选择代理类的类型

      默认的,使用<aop:scoped-proxy/>元素配置而生成的代理类是基于CGLIB的,CGLIB代理类只拦截公共的方法,非公共的方法不会被拦截。

      所以,我们可以设置生成标准的基于接口的JDK代理。

      <!-- DefaultUserPreferences implements the UserPreferences interface -->
      <bean id="userPreferences" class="com.stuff.DefaultUserPreferences" scope="session">
          <aop:scoped-proxy proxy-target-class="false"/>
      </bean>
      
      <bean id="userManager" class="com.stuff.UserManager">
          <property name="userPreferences" ref="userPreferences"/>
      </bean>
      

      使用基于接口的JDK代理意味着我们不在需要额外的包来生成代理,同时也意味着com.stuff.DefaultUserPreferences至少需要实现一个接口,并且com.stuff.UserManager的userPreferences属性的类型必须是com.stuff.DefaultUserPreferences所实现的一个接口(这里是UserPreferences)

【动态多智能体系统的通信感知编队控制】一种新颖的通信感知编队控制策略,用于动态多智能体系统研究(Matlab代码、Python代码实现) 内容概要:文档名为《Plecs全桥LLC谐振变换器仿真模型.txt》,但其内容并未深入介绍Plecs环境下全桥LLC谐振变换器的具体建模与仿真过程,而是呈现为一份涵盖多领域科研主题的资源列表。文档内容广泛涉及多智能体系统控制、无人机路径规划、电力电子变换器、状态估计、信号处理、优化算法等研究方向,并多次提及Matlab/Simulink、Python等工具的代码实现。整体来看,该文档更像是一份科研项目目录或技术资源索引,重点推介了包括LLC谐振变换器在内的多种控制系统与电力电子仿真模型,但对标题所述核心内容缺乏详尽的技术描述与实现细节。; 适合人群:电力电子、自动化、控制工程、信号处理及多智能体系统等相关领域的研究生、科研人员与工程技术人员。; 使用场景及目标:①为科研工作者提供跨学科的技术方向参考与研究选题灵感;②获取电力系统、无人机控制、信号处理等领域成熟的Matlab/Simulink或Python仿真代码资源,用于算法验证与模型复现。; 阅读建议:建议将此文档作为科研资源导航目录使用,读者可根据自身研究方向筛选感兴趣的主题,并通过文中提供的公众号或网盘链接获取完整的代码、仿真模型与配套资料进行深入学习与实践。 立即下载

相关推荐

Graylog日志系统实战:高效接收与解析交换机日志

本文提供Graylog日志系统的实战部署与配置指南,重点讲解如何高效接收与解析交换机日志。通过Docker快速部署,配置Syslog输入,并指导华为、华三等主流交换机将日志发送至Graylog。文章还介绍了使用提取器解析日志字段、创建数据流进行分类,以及设置报警规则,实现从被动排查到主动预警的运维转变,帮助网络工程师构建集中、智能的日志管理系统。

weixin_29284885的博客 540

Abp中使用Scope生命周期类处理业务

Abp中使用Scope生命周期类处理业务

zx493734247的博客 834

endnote让参考文献整整齐齐

这篇文章主要是针对利用 endnote 插入参考文献时,参考文献第一行和后面的行对不齐的问题 下面是示意图 可以看到我们的参考文献对的整整齐齐的,比较好看。 下面介绍具体步骤 1、打开endnote。编辑我们使用的参考文献样式。我这儿是叫 ZZ_MODIFIED_GEEBINF 复制 2、找到布局,每个参考开头,将光标放在在参考开头后面,点插入字段,制表符 3、右下角悬挂式输出哪儿选择全部段...

雾隐雾现的至渝博客 5万+

C# IoC学习笔记

一、引言 IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP):设计模式六大原则之一,是一种软件架构设计原则。 控制反转(IoC):一种软件设计原则,上层对下层的依赖(即底层模块的获得)交给第三方。 依赖注入(DI):实现IoC的一种方式、手段。 IoC容器:依赖注入的框架,用来映射依赖,管理对象的...

qq_35382207的博客 476

2019美亚杯团体赛刷题 部分题解(1-42、106-116)

文章目录写在前面使用工具刷题1.在黑客路由器里,有一台设备的MAC地址为00:11:6B:47:4D:55,请问它的IP地址是什么?2.在黑客路由器里,发现一设备的IP地址为192.168.0.103,请问该设备为如下哪一个:3.警方已经查证所有连接此router的设备都归黑客所有,根據黑客路由器的訊息,下列哪组(设备---ip)是错误的:4.Hacker现场检获的Windows主机硬盘已成功取证并制作成镜像Win1.E01,下列哪个是其硬盘证据文件的MD5哈希值。5.MD5hash算法会产生一个什么大小的

7ruth0hn的博客 7547

超详细 | 贝叶斯网络基础——有图有真相

Hello,大家好,我是starz。这是本系列的第二篇《概率基础Ⅱ》,虽说是概率基础,但作为过渡,它开始以图为载体 这节的主要内容有: 贝叶斯网络 三种结构 D-划分 贝叶斯球 马尔科夫毯 应用例子 总结 让我们开始吧 :3 贝叶斯网络 概率图模型可笼统分为两类,一是基于无向图的马尔科夫网络: 二是基于有向图的贝叶斯...

qq_41603411的博客 2万+

Spring笔记-ioc4 bean的作用域 singleton Prototype requesst session

Bean的作用域 在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象 . 几种作用域中,request、session作用域仅在基于web的应用中使用(不必关心你所采用的是什么web应用框架),只能用在基于web的Spring ApplicationContext环境。 创建实体类: package com.lx.pojo; public class User { private Stri

m0_47734729的博客 246

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍

通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。

MHD0815的博客 1873

SpringBoot中引入WebSocket

SpringBoot中引入WebSocket 1、引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot

风萧水寒的博客 5036

TPAMI 2025 | 从缺失碎片到杰作:基于上下文自适应扩散的图像修复

图像修复是一项具有挑战性的任务,尤其是要确保生成的内容与图像的现有部分无缝融合。尽管最近的扩散模型展现出了潜力,但它们在保持已知区域和未知(缺失)区域之间的连贯性方面常常遇到困难。这个问题源于扩散过程中缺乏明确的空间和语义对齐,导致生成的内容无法与原始图像平滑融合。此外,扩散模型通常依赖全局学习分布,而非局部特征,这使得生成的图像部分与现有图像部分之间存在不一致。在这项工作中,作者提出了ConFill,这是一个新颖的框架,引入了上下文自适应差异(CAD)模型,以确保在整个扩散过程中,已知区域和未知区域的中间

小白学视觉 240

【3天快速入门WPF】1-从最简单的xaml开始

首先我们要知道xaml语法中声明即定义,意思就是“见到元素就相当于创建实例”,MainWindow.xaml的主干是一个元素里包含着一个 元素。这段程序就是在定义一个Window类的实例,这个实例的一个组成部分是一个Grid类的实例。

Zy100Papa的博客 1623

《Spring in Action》第8章-异步消息发送

异步消息发送 JMS JMS是一个标准,它定义了同消息中间件工作的通用API。Spring提供了JmsTemplate,我们可以使用这个模板来使用JMS。 JMS设置 在使用JMS之前,我们需要在项目中添加JMS客户端。对于Spring Boot来说,我们只需要添加starter依赖就可以了。 如果我们使用ActiveMQ: <dependency> <groupId&g...

风萧水寒的博客 827

56、CAN总线RC低通滤波器截止频率计算与实战

本文详细探讨了CAN总线RC低通滤波器的设计与应用。作者通过实际项目案例,分析了CAN总线噪声频谱特性,提出截止频率计算的"黄金法则",强调需考虑收发器输入阻抗的并联效应。文章给出RC参数选择的经验值(R=100Ω-1kΩ,C=10pF-100pF),并指出PCB布局的关键要点:RC应紧贴收发器引脚,电容接地端需直接连接地平面。最后建议结合示波器和眼图验证效果,并提醒RC滤波器只是抗干扰方案的一部分,良好的PCB布局设计才是根本。

2401_88858637的博客 70

《Spring in Action》第3章-使用数据库

Spring与数据库 使用JDBC读写数据 使用JDBC(Java Database Connectivity)完成一次查询: Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try{ connection = dataSource.getConnecti...

风萧水寒的博客 627

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《Spring in Action》第6章-REST services

REST services 编写RESTful风格的controller SpringMVC 提供了@RequestMapping注解用于映射请求与对应的Controller方法。同时,还提供了以下几个更加详细的注解: Annotation HTTP method Typical use @GetMapping HTTP GET requests Reading resource ...

风萧水寒的博客 574

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

《Spring in Action》第1章-开始使用Spring

开始使用Spring 1、构建一个Spring应用 使用Spring Initializr构建应用: http://start.spring.io 为Eclipse安装插件,并使用Eclipse创建 在IntelliJ IDEA中创建 2、构建后的应用结构 在构建项目时我们选择以下的依赖: 生成的项目结构如下: mvnw和mvnw.cmd是maven的打包脚本,及时我们没有安装mav...

风萧水寒的博客 502

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

《Spring in Action》第2章-创建一个Web应用

开发Web应用 建立Domain Domain:一个引用的Domain就是这个应用处理的主体领域。在TacoCloud应用中,我们希望提供一个用户自己设计Taco的功能,那么Taco的成分类就属于该应用的Domain。 import lombok.Data; import lombok.RequiredArgsConstructor; @Data @RequiredArgsConstructor...

风萧水寒的博客 454

《Spring in Action》第4章-Spring Security

Spring Security 开始使用Spring Security 加入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </depen...

风萧水寒的博客 453

Spring MVC 是如何处理请求的

SpringMVC 处理请求的过程 请求离开浏览器,到达DispathcerServlet,SpringMVC的每个请求都要通过这个前端控制器(front controller) Servlet。 在这里一个单实例的Servlet将请求委托给应用程序的其他组件来执行实际的操作。 DispathcerServlet的任务是将请求发送给Spring MVC控制器(Controller),一般应...

风萧水寒的博客 423

《Spring in Action》第5章-Configuration Properties

Configuration Properties 调整自动配置 Environment abstraction 对于任何可配置属性来说,Spring的Enviroment abstraction就是一个一站式的仓库。它抽象出各种属性源以供bean使用。Spring从以下几个属性源中抽取属性: JVM system propterties 操作系统环境变量 命令行擦桉树 应用的属性配置文件 Spr...

风萧水寒的博客 352

《Spring in Action》第7章-使用REST服务

使用REST服务 RestTemplate 同JDBCTemplate一样,为了消除大量繁琐的样板代码,RestTemplate提供了很多方法,使得我们能够很方便的调用REST服务。这些方法大致可分为以下12组重载方法: Method group Description getForObject Retrieves a representation via GET. ge...

风萧水寒的博客 342

01、IoCContainer-1 容器、Bean

容器、Bean 介绍 IoC(IoCInversion of Control)也叫依赖注入DI(dependency injection) 对象可以通过构造函数参数、工厂方法参数,或者是对象自己被实例化后设置的属性来定义它们所依赖的其它对象。当所依赖的对象被实例化后,容器注入这些bean。bean自己控制依赖的实例化,或者是直接通过类的解析和Service Locator模式这...

风萧水寒的博客 307

Spring AOP(面向切面编程)

基于接口的AOP 代理接口的所有方法 配置: <bean id="msgServerImpl" class="com.canwin.aop.MsgServerImpl"/> <bean id="beforeAdvice" class="com.canwin.aop.BeforeAdvice"/> <!--简单aop,需要使用代理bean--> <bean id="proxyMsgServer" class="org.springframework.aop.frame

风萧水寒的博客 252

03、IoCContainer-3 依赖

depends-on的使用 一般情况下,我们使用<ref/>元素来定义bean之间的依赖关系,但是有时候bean之间并不直接依赖。depends-on属性可以显式的强制一个或多个被依赖的beans在使用依赖的bean初始化之前被初始化。 <bean id="beanOne" class="ExampleBean" depends-on="manager"/&g...

风萧水寒的博客 216

02、IoCContainer-2 依赖

依赖 依赖注入(Dependency Injection) 依赖注入主要有两种形式: 基于构造器的依赖注入: 在改方式下,容器调用构造器,并向构造器传入参数,每个参数都是一个依赖。向静态工厂方法传递参数与向构造器传参一样。 下面这个类只能通过构造器注入进行依赖注入 public class SimpleMovieLister { // the SimpleMovieL...

风萧水寒的博客 211
上一篇: 核心技术(卷一)08、第14章-多线程
下一篇: 05、IocContainer-5 自定义Bean的性质
风萧水丶寒
博客等级 码龄11年 6粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值