随笔 - 1162  文章 - 0  评论 - 16  阅读 - 59万 

Bean 的作用域

  在 Spring 中,可以在 <bean> 元素的 scope 属性里设置 bean 的作用域,以决定这个 bean 是单实例的还是多实例的。
 
  默认情况下,Spring 只为每个在 IOC 容器里声明的 bean 创建唯一一个实例(Spring 中默认是单例的 bean),整个 IOC 容器范围内都能共享该实例;
  所有后续的 getBean() 调用和  bean 引用都将返回这个唯一的 bean 实例,该作用域被称为 singleton,它是所有 bean 的默认作用域。
 
 
  scope 用于设置 bean 的作用域,其取值有 singleton | prototype | request | session
 
singleton:单例,唯一实例,默认的
prototype:原型,多例的(Java中默认情况)
request:在web环境下,同义词请求创建一个Bean实例,在一次请求中创建一个 bean 
session:在web环境下,同义词请求创建一个Bean实例,在一次会话中创建一个 bean

 

singleton:单实例的,默认的

  (1)在容器启动完成之前就已经创建好对象,保存在容器中了;

  (2)任何获取都是获取之前创建好的那个对象;

prototype:多实例的

  (1)容器启动默认不会去创建多实例 bean;

  (2)获取的时候创建多实例 bean;

  (3)每次获取都会创建一个新的对象;

 

注意
    当 bean 的作用域为单例时,Spring 会在 IOC 容器初始化时就创建 bean 的对象实例;
    而当 bean 的作用域为 prototype 时,IOC 容器会在获取 bean 的实例时创建 bean 的实例对象(即在使用 bean 时,才进行创建实例对象)
 
  配置bean 的作用域:
    <bean id="book01" class="com.njf.spring.bean.Book" scope="singleton"></bean>

    <bean id="book02" class="com.njf.spring.bean.Book" scope="prototype"></bean>

 

 
  测试代码:
复制代码
    @Test
    public void test4() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc3.xml");

        Object book01 = ioc.getBean("book01");
        Object _book01 = ioc.getBean("book01");
        System.out.println(book01 == _book01); //true

        Object book02 = ioc.getBean("book02");
        Object _book02 = ioc.getBean("book02");
        System.out.println(book02 == _book02); //false
    }
复制代码

 

 
 
 
 
posted on   格物致知_Tony  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示

目录导航