聊聊spring中bean的作用域(代码片段)

刘牌 刘牌     2023-04-05     539

关键词:

前言

今天分享一下spring bean的作用域,理解bean的作用域能够在使用过程中避免一些问题,bean的作用域也是spring bean创建过程中一个重要的点。

Spring bean的作用域类型

  • singleton(单例模式):在整个应用程序的生命周期中,只创建一个Bean实例。默认情况下,所有的Bean都是单例模式。

  • prototype(原型模式):每次请求Bean时都会创建一个新的实例。

  • request(请求模式):每次HTTP请求都会创建一个新的实例,该作用域仅适用于Web应用程序的Spring MVC应用程序。

  • session(会话模式):每个用户会话都有一个Bean实例,该作用域仅适用于Web应用程序的Spring MVC应用程序。

  • globalSession(全局会话模式):用于Portlet应用程序,一个全局会话有一个Bean实例。

  • application(应用程序模式):在Web应用程序上下文中,只创建一个Bean实例。

从上面我们能看出spring有很多种作用域,不过在实际使用中,我们基本都使用单例bean,这也是spring bean的默认作用域,单例bean能提高性能,因为全局只存在一个bean实例,而多例bean则每次请求都需要创建bean实例,当并发比较大的时候,就会比较影响性能,所以这时候就需要使用单例bean,但是单例bean可能会存在线程安全问题,当bean中存在可变的成员变量时,就会存在线程安全问题,而多例bean因为每次都会创建一个实例,所以不存在bean共享,就不存在线程安全问题。

使用作用域

现在我们基本都是使用SpringBoot,都是基于注解开发,我们可以使用注解@Scope设置bean的作用域,可以标注在类上和方法上。

标注方法

当我们使用@Bean定义Bean的时候,设置作用域可以直接在方法上面使用@Scope。

@Bean
@Scope("prototype")
public ScopeBean scopeBean()
    return new ScopeBean();

标注类

使用@Component,@Service等注解定义bean时,设置作用域直接在类上添加@Scope。

@Component
@Scope("prototype")
public class ScopeBean 


获取bean和创建bean

如果是单例bean,在spring容器启动的时候会将Bean注册进IOC容器中,如果是多例bean,则不注册进IOC容器中。

bean在实例化前会把bean的基础信息组装成BeanDefinition,然后保存到BeanFactory中,如果是单例的bean,则会继续对bean处理后将bean注册到IOC容器中,如果是多例bean,则不注册进,当从IOC容器中获取bean时,如果是单例则从IOC容器中获取已经创建好的bean,如果是多例,则从BeanFactory中获取bean的定义信息BeanDefinition,然后重复和单例bean一样的步骤创建bean,只是创建后它不会保存进IOC容器,而是直接返回。

作用域和懒加载

如果bean设置为懒加载(Lazy)和单例bean,那么bean在spring启动时不会注册进容器中,而是等第一次获取bean的时候在创建bean,后面获取bean的时候再从IOC容器中获取,如果设置为多例bean,那么懒加载其实是没用的。

源码解析

源码比较简单,其实就是判断bean的类型,然后再进入不同的逻辑进行处理,在AbstractBeanFactory中,通过doGetBean()方法获取bean。

判断bean是否存在容器中

下图通过getSingleton()方法从singletonObjects中获取bean,如果获取到直接返回,代表bean已经创建过勒,已经存在与IOC容器中,singletonObjects就是整个spring中装bean实例的容器,他就是一个Map,spring整个bean的创建过程目的就是把bean放进它里面,所以spring简单得不行,但是更复杂得不行

bean不存在,则创建

下图有两个判断,判断单例bean和多例bean,单例bean会创建bean后然后加入到singletonObjects中,多例bean则直接返回,他们的创建都是走同一个方法,同一样的流程。

具体的创建流程就不一一细说,只是从大体思路去讲解,因为往里面说就贴出大篇代码,没啥必要,感兴趣可以去看源码。

总结

上面说了bean的作用域类型,并对每种作用域类型进行分析,最常用的其实就是单例,并对多例和单例使用过程中的一些注意事项进行讲解,接着说了怎么使用作用域,还有懒加载和作用域的关联,并对bean的创建和获取从源码和白话进行大体的分析。

今天的分享就到这里,感谢你的观看,我们下期见!

spring--bean作用域(代码片段)

 Spring框架功能强大,其中一个常用的功能是使用IOC容器来管理Bean,在创建Bean的过程中,主要有5中作用域,下面就来介绍一下每一个作用域的特点和作用。 1、Singleton:设置为该模式的Bean,容器初始化时... 查看详情

详解spring中bean的作用域与生命周期(代码片段)

摘要:在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对象,也是小伙伴们在学习和使用Spring时需要注意的部分,所以这一篇文章我就来和大家讲一... 查看详情

spring框架学习----bean作用域(代码片段)

文章目录Spring框架学习(六)----Bean作用域一、singleton(单例模式)二、protoType(原型模式)Spring框架学习(六)----Bean作用域  经过前面的学习,我们可以知道bean是存在作用域的。  从spring的官方文档中发现sp... 查看详情

详解spring中bean的作用域与生命周期(代码片段)

...ff0c;我是灰小猿!一个超会写bug的程序猿!在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对 查看详情

详解spring中bean的作用域与生命周期(代码片段)

...ff0c;我是灰小猿!一个超会写bug的程序猿!在利用Spring进行IOC配置时,关于bean的配置和使用一直都是比较重要的一部分,同时如何合理的使用和创建bean对 查看详情

配置bean的作用域(代码片段)

一、Spring中Bean的5个作用域在Spring2.0及之后的版本中,Bean的作用域被划分为5种。如下singleton      默认值。以单例模式创建Bean的实例,即容器中该Bean的实例只有一个prototype     每次从容器中获取Bean时,都会创... 查看详情

spring5学习笔记—“bean的作用域”(代码片段)

目前SpringBean的作用域/范围主要有五种:(常用:singleton,prototype)在Spring里面,默认情况下,bean是单实例对象;我们在Spring配置文件中使用bean标签创建对象时,可以使用scope属性来设置bean的作用域... 查看详情

spring(bean作用域和生命周期)(代码片段)

目录1.案例1:Bean作用域的问题2.作用域3.设置Bean的作用域4.Spring的执行流程5.Bean的生命周期1.案例1:Bean作用域的问题现在有一个公共的Bean,通过给A用户和B用户使用,然后在使用的过程中A偷偷的修改了公共Bean的数据,导致B在使用时发... 查看详情

spring中bean的作用域与生命周期(代码片段)

...g.csdn.net/fuzhongmin05推荐:https://www.xttblog.com/?p=5255在Spring中, 查看详情

spring中bean的作用域与生命周期(代码片段)

...g.csdn.net/fuzhongmin05推荐:https://www.xttblog.com/?p=5255在Spring中, 查看详情

学习笔记——spring管理第三方bean;spring中bean的作用域;spring中bean的生命周期;spring中bean的后置处理器;spring中自动装配(代码片段)

2023-01-17一、Spring管理druid步骤 (1)导入jar包<!--https://mvnrepository.com/artifact/com.alibaba/druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artif 查看详情

spring详解bean的六种作用域执行流程生命周期(代码片段)

@TOCBean作⽤域和⽣命周期从前⾯的博客我们可以看出Spring是⽤来读取和存储Bean,因此在Spring中Bean是最核⼼的操作资源,所以接下来我们深⼊学习⼀下Bean对象通过⼀个案例来看Bean作⽤域的问题假设现在有⼀个公共的Bean,提供给A... 查看详情

spring框架spring依赖注入dibean作用域bean的自动装配(代码片段)

Spring依赖注入DI、Bean作用域、Bean的自动装配依赖注入(DependencyInjection,DI)依赖:指Bean对象的创建依赖于容器,Bean对象的依赖资源注入:指Bean对象所依赖的资源,由容器来设置和装配构造器注入构造器注入:https://www.cnblogs.com/luoxiao1104... 查看详情

spring总结之二(bean作用域依赖注入)(代码片段)

###Bean的作用域:单例(singleton),多例(prototype)1.单例模式:表示在任何地方使用对象,总是一个(对象是唯一的)。(笔面试重点)饿汉式publicclassKingprivatefinalstaticKingking=newKing();privateKing()publicstaticKinggetKing()returnking;懒汉式publiccla 查看详情

java八股系列——springbean的作用域与生命周期(代码片段)

一:作用域SpringBean作用域是指在Spring容器中管理的Bean对象的生命周期和可见范围。Spring框架提供了五种Bean作用域:Singleton(单例):单例模式,SpringIOC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用... 查看详情

spring学习-ioc-scope作用域(代码片段)

scope作用域scope作用域定义了spring容器中生成的bean实例的可见范围,包括如下:singleton:生成唯一的bean实例,是spring里的缺省作用域,spring容器初始化时进行实例化prototype:每次请求时,都会生成新的b... 查看详情

spring(ioc和bean的作用域)(代码片段)

SpringSpring为简化开发而生,让程序员只关心核心业务的实现,尽可能的不在关注非业务逻辑代码(事务控制,安全日志等)。1,Spring八大模块这八大模块组成了Spring1.1SpringCore模块这是Spring框架的最基础的部分,它提供了依赖注... 查看详情

bean注解(annotation)配置-bean作用域与生命周期回调方法配置(代码片段)

Spring系列教程Spring框架介绍Spring框架模块Spring开发环境搭建(Eclipse)创建一个简单的Spring应用Spring控制反转容器(InversionofControl–IOC)理解依赖注入(DI–DependencyInjection)BeanXML配置(1)-通过XML配置加载BeanBeanXML配置(2)-Bean作... 查看详情