返回顶部
首页 > 资讯 > 精选 >Spring中Bean的作用域是什么
  • 708
分享到

Spring中Bean的作用域是什么

2023-06-20 19:06:42 708人浏览 独家记忆
摘要

这篇文章给大家介绍spring中Bean的作用域是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、Bean的作用域首先我们来讲一下有关于bean的作用域,一般情况下,我们书写在ioc容器中的配置信息,会在我们的i

这篇文章给大家介绍spring中Bean的作用域是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一、Bean的作用域

首先我们来讲一下有关于bean的作用域,

一般情况下,我们书写在ioc容器中的配置信息,会在我们的ioC容器运行时被创建,这就导致我们通过IOC容器获取到bean对象的时候,往往都是获取到了单实例的Bean对象,

这样就意味着无论我们使用多少个getBean()方法,获取到的同一个JavaBean都是同一个对象,这就是单实例Bean,整个项目都会共享这一个bean对象。

在Spring中,可以在<bean>元素的scope属性里设置bean的作用域,以决定这个bean是单实例的还是多实例的。Scope属性有四个参数,具体的使用可以看下图:

Spring中Bean的作用域是什么

1、单实例Bean声明

默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC容器范围内都能共享该实例:所有后续的getBean()调用和bean引用都将返回这个唯一的bean实例。该作用域被称为singleton,它是所有bean的默认作用域。也就是单实例。

为了验证这一说法,我们在IOC中创建一个单实例的bean,并且获取该bean对象进行对比:

<!-- singleton单实例bean  1、在容器创建时被创建  2、只有一个实例  --><bean id="book02" class="com.spring.beans.Book" scope="singleton"></bean>

测试获取到的单实例bean是否是同一个:

@Testpublic void test09() {    // 单实例创建时创建的两个bean相等    Book book03 = (Book)iocContext3.getBean("book02");    Book book04 = (Book)iocContext3.getBean("book02");    System.out.println(book03==book04);}

得到的结果是true;

2、多实例Bean声明

而既然存在单实例,那么就一定存在多实例。我们可以为bean对象的scope属性设置prototype参数,以表示该实例是多实例的,同时获取IOC容器中的多实例bean,再将获取到的多实例bean进行对比,

<!-- prototype多实例bean1、在容器创建时不会被创建,2、只有在被调用的时候才会被创建3、可以存在多个实例 --><bean id="book01" class="com.spring.beans.Book" scope="prototype"></bean>

测试获取到的多实例bean是否是同一个:

@Testpublic void test09() {    // 多实例创建时,创建的两个bean对象不相等    Book book01 = (Book)iocContext3.getBean("book01");    Book book02 = (Book)iocContext3.getBean("book01");    System.out.println(book01==book02);}

得到的结果是false

这就说明了,通过多实例创建的bean对象是各不相同的。

在这里需要注意:

同时关于单实例和多实例bean的创建也有不同,当bean的作用域为单例时,Spring会在IOC容器对象创建时就创建bean的对象实例。而当bean的作用域为prototype时,IOC容器在获取bean的实例时创建bean的实例对象。

二、Bean的生命周期

1、bean的初始和销毁

其实我们在IOC中创建的每一个bean对象都是有其特定的生命周期的,在Spring的IOC容器中可以管理bean的生命周期,Spring允许在bean生命周期内特定的时间点执行指定的任务。如在bean初始化时执行的方法和bean被销毁时执行的方法。

Spring IOC容器对bean的生命周期进行管理的过程可以分为六步:

  • 通过构造器或工厂方法创建bean实例

  • 为bean的属性设置值和对其他bean的引用

  • 调用bean的初始化方法

  • bean可以正常使用

  • 当容器关闭时,调用bean的销毁方法

那么关于bean的初始和销毁时执行的方法又该如何声明呢?

首先我们应该在bean类内部添加初始和销毁时执行的方法。如下面这个javabean:

package com.spring.beans;public class Book {private String bookName;private String author;public void myInit() {System.out.println("book bean被创建");}public void myDestory() {System.out.println("book bean被销毁");}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}@Overridepublic String toString() {return "Book [bookName=" + bookName + ", author=" + author + "]";}}

这时我们在配置bean时,可以通过init-method和destroy-method 属性为bean指定初始化和销毁方法,

<!-- 设置bean的生命周期destory-method:结束调用的方法init-method:起始时调用的方法 --><bean id="book01" class="com.spring.beans.Book" destroy-method="myDestory" init-method="myInit"></bean>

这样当我们在通过IOC容器创建和销毁bean对象时就会执行相应的方法,

但是这里还是有一点需要注意:

我们上面说了,单实例的bean和多实例的bean的创建时间是不同的,那么他们的初始方法和销毁方法的执行时间就稍稍有不同。

单实例下 bean的生命周期

容器启动——>初始化方法——>(容器关闭)销毁方法

多实例下 bean的生命周期

容器启动——>调用bean——>初始化方法——>容器关闭(销毁方法不执行)

2、bean的后置处理器

什么是bean的后置处理器?bean后置处理器允许在调用初始化方法前后对bean进行额外的处理

bean后置处理器对IOC容器里的所有bean实例逐一处理,而非单一实例。

其典型应用是:检查bean属性的正确性或根据特定的标准更改bean的属性。

bean后置处理器使用时需要实现接口:

org.springframework.beans.factory.config.BeanPostProcessor。

在初始化方法被调用前后,Spring将把每个bean实例分别传递给上述接口的以下两个方法:

postProcessBeforeInitialization(Object, String)调用前

postProcessAfterInitialization(Object, String)调用后

如下是一个实现在该接口的后置处理器:

package com.spring.beans;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;public class MyBeanPostProcessor implements BeanPostProcessor{@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {// TODO Auto-generated method stubSystem.out.println("【"+ beanName+"】初始化方法执行前...");return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {// TODO Auto-generated method stubSystem.out.println("【"+ beanName+"】初始化方法执行后...");return bean;}}

将该后置处理器加入到IOC容器中:

<!-- 测试bean的后置处理器 --><bean id="beanPostProcessor" class="com.spring.beans.MyBeanPostProcessor"></bean>

由于现在我们的bean对象是单实例的,所以容器运行时就会直接创建bean对象,同时也会执行该bean的后置处理器方法和初始化方法,在容器被销毁时又会执行销毁方法。我们测试如下:

//由于ApplicationContext是一个顶层接口,里面没有销毁方法close,所以需要使用它的子接口进行接收ConfigurableApplicationContext iocContext01 = new ClassPathXmlApplicationContext("ioc1.xml");@Testpublic void test01() {iocContext01.getBean("book01");iocContext01.close();}

运行结果:

Spring中Bean的作用域是什么

Spring中Bean的作用域是什么

总结一下后置处理器的执行过程:

通过构造器或工厂方法创建bean实例为bean的属性设置值和对其他bean的引用将bean实例传递给bean后置处理器的postProcessBeforeInitialization()方法调用bean的初始化方法将bean实例传递给bean后置处理器的postProcessAfterInitialization()方法bean可以使用了当容器关闭时调用bean的销毁方法

所以添加bean后置处理器后bean的生命周期为:

容器启动——后置处理器的before...——>初始化方法——>后置处理器的after...———>(容器关闭)销毁方法

关于Spring中Bean的作用域是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Spring中Bean的作用域是什么

本文链接: https://lsjlt.com/news/299489.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring中Bean的作用域是什么
    这篇文章给大家介绍Spring中Bean的作用域是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、Bean的作用域首先我们来讲一下有关于bean的作用域,一般情况下,我们书写在IOC容器中的配置信息,会在我们的I...
    99+
    2023-06-20
  • Spring中的Bean作用域是什么
    本文小编为大家详细介绍“Spring中的Bean作用域是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring中的Bean作用域是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。概述scope用来声明...
    99+
    2023-06-30
  • Spring中Bean的作用域与生命周期是什么
    这篇文章主要讲解了“Spring中Bean的作用域与生命周期是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring中Bean的作用域与生命周期是什么”吧!一、Bean的作用域通过S...
    99+
    2023-06-22
  • 解读Spring Bean的作用域
    目录目前Spring Bean的作用域或者说范围主要有五种(1)被声明为singleton的bean(2)被声明为prototype的bean(3)使用注解定义 bean 的作用域(...
    99+
    2022-11-13
    Spring Bean Bean作用域 Spring Bean作用域
  • Spring Bean中Bean的注册是什么
    这篇文章主要介绍“Spring Bean中Bean的注册是什么”,在日常操作中,相信很多人在Spring Bean中Bean的注册是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spr...
    99+
    2023-06-29
  • 一文搞懂Spring中的Bean作用域
    目录概述Singletonprototyperequestsessionapplication概述 scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对...
    99+
    2024-04-02
  • Spring IOC容器Bean的作用域及生命周期是什么
    本篇内容介绍了“Spring IOC容器Bean的作用域及生命周期是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!bean作用域bean...
    99+
    2023-06-30
  • Spring Bean作用域实例分析
    这篇文章主要介绍“Spring Bean作用域实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean作用域实例分析”文章能帮助大家解决问题。Bean作用域bean是存在作用域的...
    99+
    2023-07-02
  • Spring简明分析Bean作用域
    目录Bean作用域一、singleton(单例模式)二、protoType(原型模式)Bean作用域   经过前面的学习,我们可以知道bean是存在作用域的。 &...
    99+
    2024-04-02
  • Java Spring中Bean的作用域及生命周期
    目录1.Bean的作用域1.1 被修改的Bean案例1.2 为什么使用单例模式作为默认作用域1.3 作用域1.4 Bean的6种作用域1.5 设置作用域2.Spring执行流程和Be...
    99+
    2022-11-13
    Java Spring中Bean的作用域 Spring中Bean的生命周期
  • Spring中的bean概念是什么
    这篇文章将为大家详细讲解有关Spring中的bean概念是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。1 定义Spri...
    99+
    2023-06-29
  • Spring中Session与Request的作用域是什么
    本篇文章为大家展示了Spring中Session与Request的作用域是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Request作用域考虑下面bean定义:<bean id=&quo...
    99+
    2023-05-31
    spring request session
  • Spring中Bean的作用域与生命周期详解
    目录一、Bean的作用域1、单实例Bean声明2、多实例Bean声明二、Bean的生命周期1、bean的初始和销毁2、bean的后置处理器总结一、Bean的作用域 首先我们来讲一下有...
    99+
    2024-04-02
  • Spring中Bean的作用域和自动装配方式
    目录Bean的作用域默认配置scope = “singleton”scope = “prototype”Bean的自动装配通过name自动装配通过type自动装配Bean的作用域 S...
    99+
    2024-04-02
  • 详解Spring中Bean的作用域与生命周期
    目录一、Bean的作用域二、Bean的生命周期使用代码演示Bean的生命周期一、Bean的作用域 通过Spring容器创建一个Bean的实例时,不仅可以完成Bean的实例化,还可以使...
    99+
    2024-04-02
  • spring调用bean的方法是什么
    Spring调用Bean的方法通常有以下几种方式: 通过XML配置文件进行配置,在配置文件中声明Bean并指定其相应的属性和方法。...
    99+
    2024-04-09
    spring
  • spring中bean的生命周期是什么
    在Spring中,Bean的生命周期包括以下几个阶段:1. 实例化:当Spring容器接收到请求时,根据配置文件或注解等方式,在内存...
    99+
    2023-09-27
    spring bean
  • Spring中Bean扫描原理是什么
    本篇内容主要讲解“Spring中Bean扫描原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring中Bean扫描原理是什么”吧!环境建设由于创建包扫描的条件很简单,只要在Xml中配...
    99+
    2023-07-02
  • Spring Bean中的作用域和生命周期实例分析
    这篇文章主要介绍“Spring Bean中的作用域和生命周期实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring Bean中的作用域和生命周期实例分析”文章能帮助大...
    99+
    2023-07-02
  • spring中bean的初始化方法是什么
    在Spring中,bean的初始化可以通过两种方式来完成:使用@Bean注解的initMethod属性或者实现Initializin...
    99+
    2023-09-21
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作