详解Spring中bean的作用域

article/2025/9/22 21:11:28
如何使用spring的作用域:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "singleton"/ >
这里的 scope 就是用来配置 spring bean 的作用域,它标识 bean 的作用域。
在 spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称prototype), Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean。当然,Spring2.0对Bean的类型的设计进行了重构,并设计出灵活的Bean类型支持,理论上可以有无数多种类型的Bean,用户可以根据自己的需要,增加新的Bean类型,满足实际应用需求。
1、 singleton 作用域
当一个 bean的 作用域设置为 singleton, 那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。
配置实例:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "singleton"/ >
或者
< bean id = "role" class = "spring.chapter2.maryGame.Role" singleton= "true"/ >
2、prototype
prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的 getBean()方法)都会产生一个新的bean实例,相当与一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个 prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源,都是客户端代码的职责。(让Spring容器释放被singleton作用域bean占用资源的一种可行方式是,通过使用bean的后置处理器,该处理器持有要被清除的bean的引用。)
配置实例:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "prototype"/ >
或者
< bean id = "role" class = "spring.chapter2.maryGame.Role" singleton= "false"/ >
3、 request
request表示该针对每一次 HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:
request、 session、global session使用的时候首先要在初始化web的web.xml中做如下配置:
如果你使用的是 Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:
  < web-app >
  ...
  
< listener >
< listener-class > org.springframework.web.context.request.RequestContextListener </ listener-class >
  
</ listener >
  ...
</ web-app >

,如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:
< 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 >

接着既可以配置 bean的作用域了:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "request"/ >
4、session
session作用域表示该针对每一次 HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "session"/ >
5、 global session
global session作用域类似于标准的 HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
< bean id = "role" class = "spring.chapter2.maryGame.Role" scope= "global session"/ >
6、自定义bean装配作用域
在spring2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.Scope来定义,自定义自己的作用域只要实现该接口即可,下面给个实例:
我们建立一个线程的scope,该scope在表示一个线程中有效,代码如下:
publicclass MyScope  implements  Scope 
     privatefinal ThreadLocal threadScope 
= new ThreadLocal() {
          
protected Object initialValue() {
            returnnew HashMap(); 
          }
 
    }

     
public Object get(String name, ObjectFactory objectFactory) 
        Map scope 
= (Map) threadScope.get(); 
        Object object 
= scope.get(name); 
        
if(object==null
          object 
= objectFactory.getObject(); 
          scope.put(name, object); 
        }
 
        
return object; 
     }
 
     
public Object remove(String name) 
        Map scope 
= (Map) threadScope.get(); 
        
return scope.remove(name); 
     }

     publicvoid registerDestructionCallback(String name, Runnable callback) 

     }

    
public String getConversationId() {
       
// TODO Auto-generated method stub
       returnnull;
    }
 
          }

 

http://chatgpt.dhexx.cn/article/pM4qu7be.shtml

相关文章

Bean的作用域和生命周期

下期进入springboot咯~ 目录 1.Bean的作用域 1.1Bean的六大作用域 1.2设置Bean的作用域 2.Bean的执行流程 3.Bean的生命周期 1.Bean的作用域 ①什么是Bean的作用域&#xff1a; 实质上是指Bean在spring整个框架中的某种行为模式&#xff0c;比如singleton单例模式&#xf…

7-Bean的作用域

目录 1.作用域定义 2.Bean的6种作用域 2.1.singleton&#xff1a;单例作用域&#xff08;默认作用域&#xff09; 2.2.prototype&#xff1a;原型作用域&#xff08;多例作用域&#xff09; 2.3.request&#xff1a;请求作用域 2.4.session&#xff1a;会话作用域 2.5.a…

Spring Bean的作用域以及注解使用

点击上方 Java学习之道&#xff0c;选择 设为星标 每天12点&#xff0c;干货准时奉上&#xff01; Spring Bean的作用域 Spring Bean 的作用域即为对象的作用范围。Spring Bean的作用域由配置项 scope 来限定。 Scope配置项 作用域限定了 Spring Bean 的作用范围&#xff0c;在…

JAVA bean的作用域

1、Bean的5种作用域 &#xff08;1&#xff09;singleton&#xff1a;单例模式&#xff0c;Spring IoC容器中只会存在一个共享的Bean实例&#xff0c;无论有多少个Bean引用它&#xff0c;始终指向同一对象Singleton作用域是Spring中的缺省作用域&#xff0c;也可以显示的将Bean…

Bean 作用域和生命周期

文章目录 引入 Lombok1. Bean 的作用域问题2. 作用域定义2.1 作用域类型2.2 Bean 作用域的设置 3. Bean 的生命周期3.1 执行流程:3.2 **代码示例:** 4.Spring 生命周期 Spring 容器是用来存储和读取 Bean 的 , 因此 Bean 是 Spring 中最核心的操作资源. 引入 Lombok 编写代码过…

【Spring6】| Bean的作用域

目录 一&#xff1a;Bean的作用域 1. singleton&#xff08;单例&#xff09; 2. prototype&#xff08;多例&#xff09; 3. 其它scope 4. 自定义scop&#xff08;了解&#xff09; tips&#xff1a;首先给大家推荐两款好用的免费软件&#xff1a;动图抓取软件&#xff1…

Spring Bean的作用域及生命周期

目录 前言&#xff1a; Bean的作用域&#xff08;Scope&#xff09; 单例模式 原型模式&#xff08;多例作用域&#xff09; 请求作用域&#xff08;request&#xff09; 会话作用域 全局作用域 网络长连接 Spring执行流程 Bean的生命周期 测试 小结&#xff1a; 前…

Spring中Bean的作用域问题

文章目录 一、通过案例来简单体会一下Bean的作用域问题二、作用域定义三、Bean的作用域分类singletonprototyperequestsessionapplication&#xff08;了解&#xff09;singleton&#xff08;单例作用域&#xff09; 和 application &#xff08;全局作用域&#xff09;的区别w…

面试:Bean 作用域是什么?它有几种类型?

Spring 框架作为一个管理 Bean 的 IoC 容器&#xff0c;那么 Bean 自然是 Spring 中的重要资源了&#xff0c;那 Bean 的作用域是什么意思&#xff1f;又有几种类型呢&#xff1f;接下来我们一起来看。 PS&#xff1a;Java 中的公共类可称之为 Bean 或 Java Bean。 1、作用域…

Spring系列8:bean的作用域

本文内容 bean定义信息的意义介绍6种bean的作用域 bean定义信息的意义 Spring中区分下类、类定义信息&#xff0c;类实例对象的概念&#xff1f;不容易理解&#xff0c;以餐馆中点炒饭为例。 类&#xff1a; 相当于你看到菜单上炒饭这个菜品&#xff0c;有这个菜。 类定义…

【Java第34期】:Bean的六种作用域

作者&#xff1a;有只小猪飞走啦 博客地址&#xff1a;https://blog.csdn.net/m0_62262008?typeblog 内容&#xff1a;介绍Bean的六种作用域的效果以及适用场景 文章目录 前言一&#xff0c;作用域定义以及Bean的六种作用域是什么&#xff1f;二&#xff0c;singleton&#…

Bean的六种作用域

什么是Bean的作用域呢? 这里的"作用域"还和Java中的类级,方法级等这几个作用域概念不太一样,我自己的一个理解是:在Spring执行的这段时间中,Bean的作用域就只有单例和多例这两种,在执行respect这段时间之中,就有它自己的作用域,而到了session中又有它自己的作用域,…

Spring Bean的作用域

在Spring中&#xff0c;bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。 目前Spring Bean的作用域或者说范围主要有五种。 作用域描述singleton在spring IoC容器仅存在一个Bean实例&#xff0c;Bean以单例方式存在&#xff0c;bean作用域范围的默认值…

设计原则-依赖倒置

名称&#xff1a;依赖倒置原则&#xff08;Dependence Inversion Principle&#xff09; 定义&#xff1a;程序要依赖于抽象接口&#xff0c;不要依赖于具体实现。依赖倒置原则的中心思想是面向接口编程。 高层模块不应依赖于低层模块&#xff0c;二者都应该依赖于抽象抽象不…

C++之依赖倒置原则

C之依赖倒置原则 1. 依赖于具体抽象&#xff08;接口&#xff09;&#xff0c;不依赖于具体的实现&#xff0c;也就是针对接口编程。 2. 实现高层业务和实现层、实现层和实现层之间的解耦合&#xff1b; 实例&#xff1a; 电脑框架和电脑内部的配件产品&#xff08;或提供配…

【软件架构设计原则】开闭原则和依赖倒置原则

文章目录 软件架构设计原则开闭原则依赖倒置原则最后 软件架构设计原则 本文通过实例来讲解 开闭原则依赖导致原则 开闭原则 开闭原则&#xff08;Open-Close Principle&#xff0c;OCP&#xff09;是指一个软件实体&#xff08;如类、模块和函数&#xff09;应该对扩展开放…

java 依赖倒置_Java设计原则—依赖倒置原则(转)

依赖倒置原则(Dependence Inversion Principle&#xff0c;DIP)的原始定义&#xff1a; 高层模块不应该依赖底层模块&#xff0c;两者都应该依赖其抽象&#xff1b; 抽象不应该依赖细节&#xff1b; 细节应该依赖抽象。 依赖倒置原则在Java语言中的表现是&#xff1a; 模块间的…

设计模式 依赖倒置原则

文章目录 依赖倒置原则依赖倒置原则实战使用依赖倒置原则进行改变案例中两种方式的类图 依赖倒置原则 定义: 程序要依赖于抽象接口, 不要依赖于具体实现, 对抽象进行编程, 而不是对实现进行编程, 降低了客户与实现模块的耦合. 高层模块不应该依赖底层模块, 都应该依赖抽象(接口…

依赖倒置原则应用-司机开车案例

依赖倒置原则 依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口&#xff0c;不要依赖于具体实现。简单的说就是要求对抽象进行编程&#xff0c;不要对实现进行编程&#xff0c;这样就降低了客户与实现模块间的耦合。 依赖倒置原则三层含义&#xff1a; …

4.3 依赖倒置原则

一. 依赖倒置原则的定义 1.核心思想 依赖倒置原则&#xff08;Dependence Inversion Principle&#xff0c;DIP&#xff09; *1.高层模块 不应该依赖 低层模块, 二者都应该依赖其抽象; *2.抽象 不应该依赖 细节, 细节 应该依赖 抽象; 接口和抽象类价值在于设计; *3.依赖倒…