【Spring 从0开始】IOC容器的Bean管理 - Bean 的作用域

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【Spring 从0开始】IOC容器的Bean管理 - Bean 的作用域

bean的作用域,其实就是设置创建 bean 的实例是属于单实例,还是多实例。


1. 默认单实例


默认情况下,创建的 bean 是单实例对象


比如,用之前的代码为例:


@Test
    public void testCollection2() {
        ApplicationContext context =
                new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book", Book.class);
        Book book2 = context.getBean("book", Book.class);
        System.out.println(book);
        System.out.println(book2);
    }


在测试方法中,创建了 2 个 Book 类型的实例 book 和 book2,默认情况下应该是单实例,打印出来的地址应该一致。


com.pingguo.spring5.collectiontype.Book@4ae82894
com.pingguo.spring5.collectiontype.Book@4ae82894
Process finished with exit code 0


地址一致。


2. 设置多实例


在配置文件中的 bean 标签里,有一个属性 scope 是用来设置单实例和多实例的。

scope 有多个值:


  • singleton:也是默认值,表示单实例对象。
  • prototype:表示多实例对象。
  • request:每次 http 请求都会创建一个新的 bean,仅适用于 WebApplicationContext 环境。
  • session:同一个 http session 共享一个 bean,不同的 session 使用不同的 bean,仅适用于 WebApplicationContext 环境。


而最常用的有 2 个:singleton 和 prototype。


现在把上述的示例代码改成多实例的,那么配置文件中增加 scope="prototype"


<bean id="book" class="com.pingguo.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>


再次运行测试方法:


com.pingguo.spring5.collectiontype.Book@543788f3
com.pingguo.spring5.collectiontype.Book@6d3af739
Process finished with exit code 0


可以看到,2个对象地址不同。


此外,singleton 和 prototype 还有 1 个区别需要注意


  • scope 值为 singleton :加载 spring 配置文件的时候,就会创建单例对象。
  • scope 值为 prototype :加载配置文件时候不创建,而是在调用 getBean 方法时候创建多个实例对象。
相关文章
|
10天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
15天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
53 6
|
1月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
34 1
|
2月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
2月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
54 0
|
4月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
283 18
|
3月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
4月前
|
XML Java 开发者
经典面试---spring IOC容器的核心实现原理
作为一名拥有十年研发经验的工程师,对Spring框架尤其是其IOC(Inversion of Control,控制反转)容器的核心实现原理有着深入的理解。
167 3
|
3月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
86 0
|
5月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式