首页 > 其他分享 >SpringBean的生命周期

SpringBean的生命周期

时间:2024-10-28 18:16:28浏览次数:7  
标签:实例 缓存 userDao Service SpringBean bean 生命周期 单例

6.7 SpringBean的生命周期
6.7.1 bean的实例化

在配置好bean后,Spring取出beanDefinition查看它是否是单例bean,是否需要延迟加载等,这些都是bean语句里的那些配置信息,完成后通过反射将bean实例化。

6.7.2 bean的初始化

经过上面步骤的的bean只是一个半成品,还需要再加工。这个阶段很重要,主要完成像上面提到的Spring后处理方法,完成相关属性的注入,执行自定义初始化方法或者InitializingBean方法等。

  • bean属性注入

  • 实现Aware接口

  • 执行postProcessBeforeInitialization方法

  • 执行InitializingBean方法

  • 执行自定义init方法

  • 执行postProcessAfterInitialization方法

    下面几步在上次演示过了,就说下bean属性配置和实现Aware接口。

    bean属性注入:包括普通属性(int,String等),单向对象属性,双向对象属性。

    所谓单向对象属性,简单来说,就比如Service里引用了UserDao。

    <bean id="Service" class="com.demo.impl.ServiceImpl" >
        <property name="userDao" ref="userDao"></property>
    </bean>
    
    <bean id="userDao" class="com.demo.impl.UserDaoImpl"></bean>
    

    这里就会有个时机问题:当Service实例化后,开始注入UserDao,但此时UserDao还没有实例化。所以,Service就会停下来,等UserDao实例化后才开始注入。

    请添加图片描述

    当然,如果是放在前面的话,就不存在这种情况了。

    双向对象属性,不仅Service里引用了UserDao,而且UserDao里也引用了Service。

    <bean id="Service" class="com.demo.impl.ServiceImpl" >
            <property name="userDao" ref="userDao"></property>
    </bean>
    
    <bean id="userDao" class="com.demo.impl.UserDaoImpl">
            <property name="service" ref="Service"></property>
    </bean>
    

    请添加图片描述

    多个实体之间相互依赖并形成闭环,我们称之为“依赖闭环”,也叫做“循环引用”。这样会发生什么呢?来看:

    请添加图片描述

    当我们从getBean(“userService”)进入,先实例化Service,这个时候,内存空间里就有Service的位置了。随后Service开始初始化,如果容器里有userDao,那好说,直接拿来注入,但如果没有,则要先去实例化userDao,同样的道理,userDao实例化需要注入Service,但此时Service还没有初始化,userDao在单例池中就找不到Service,于是它也停下来等Service装进去,它等,它也等,就这样一直陷在死循环里。

    那怎么办?

    三级缓存的提出解决了这个问题。它的思想就是当需要注入时,不再在单例池中找,而是单独存另外一个Map中,先引用过来,后续需要什么再自己补充。

    在底层源码中,Spring提供了三种Map:

    public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry {
        private static final int SUPPRESSED_EXCEPTIONS_LIMIT = 100;
        //一级缓存,存完整的bean对象,即单例池Map
        private final Map<String, Object> singletonObjects = new ConcurrentHashMap(256);
        //二级缓存,存半成品bean,但是这个bean是已经被其他实体引用了的
        private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap(16);
        //三级缓存,存半成品bean,未被其他实体引用
        private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);
    

    结合上面的图来讲,当Service实例化后,将它存入三级缓存中,需要注入userDao时,先完成userDao的实例,userDao存在三级缓存中,userDao然后需要注入Service,那userDao就可以从三级缓存中找到Service,拿过来后,Service就从三级缓存中删除了,随后存在二级缓存中。而userDao后来在完成它的初始化,实现bean对象的完整过程,删除三级缓存,存进一级缓存(单例池)中。然后回溯到Service的userDao注入,它就可以直接从单例池中找到userDao,完成它的初始化等过程,最后删除二级缓存,进入一级缓存。

    请添加图片描述

    流程图如下:(主要看缓存)

    先是各自完成了实例化:

请添加图片描述

随后Service被userDao引用后,进入二级:

请添加图片描述

userDao完成bean对象的创建,进入单例池:

请添加图片描述

Service完成bean对象的创建,进入单例池:

请添加图片描述

6.7.3 bean的完成

经过上面这些步骤,bean才真正成为一个对象,然后装填在单例池中。

总体来看下。

请添加图片描述

标签:实例,缓存,userDao,Service,SpringBean,bean,生命周期,单例
From: https://blog.csdn.net/Ggjvhsjsj/article/details/143301349

相关文章

  • SpringBean的实例化过程及后处理器
    SpringBean的实例化过程我们都知道,当我们把bean交给Spring容器进行管理,也就是在xml文件中配置bean,当我们需要用到某个bean时,Spring就帮我们创建好对象使用。那我们来了解一下这中间的过程是怎样的。1.在xml中配置bean,工厂将一整个语句配置信息转换成beanDefinition对象。......
  • vue的生命周期,每个生命周期怎么使用,详细解释
    Vue的生命周期是指Vue实例从创建到销毁的过程中的各个阶段。每个阶段都有特定的生命周期钩子(hook),可以在这些钩子中执行特定的操作。下面是Vue的生命周期阶段及其对应的钩子函数的详细解释:1.创建阶段beforeCreate描述:在实例初始化之后、数据观测和事件配置之前被......
  • Java中类的生命周期(快速掌握)
    Java中类的生命周期(快速掌握)概览加载阶段第一步我们也可以使用Java代码拓展不同的渠道第二步第三步这里的InstanceKlass是区别与源代码中的Class第四步方法区中的Klass对象,是使用C++所编写出来的对象,一般不能够直接进行操作,并且其中有部分信息,开发者在开发时并......
  • 学习笔记(四):页面和自定义组件生命周期
    页面和组件的定义:自定义组件:@Component装饰的UI单元,可以组合多个系统组件实现UI的复用,可以调用组件的生命周期。页面:即应用的UI页面。可以由一个或者多个自定义组件组成,@Entry装饰的自定义组件为页面的入口组件,即页面的根节点,一个页面有且仅能有一个@Entry。只有被@Entry装饰的......
  • 课程分享 | 物联网安全TOP10及安全开发生命周期
    什么是物联网?物联网(InternetofThings,简称IoT)是指通过互联网将各种设备、物体和系统连接起来,使它们能够收集数据、交换信息,并且在某些情况下可以自动执行任务的技术体系。这些“物”可以是任何带有传感器、软件和其他技术的实体,如家用电器、工业机械、车辆、医疗设备等。......
  • Docker部署及项目的生命周期
    目标了解传统项目生命周期的阶段特点了解新型项目生命周期的特点了解部署方案的一般流程1.项目生命周期​ 世间万物皆有其生命,软件项目也是如此。随着互联网的发展,软件项目的生命周期也发生了很大的变化,为了更好的让大家理解软件项目,项目生命周期有狭义(具体)、广义(缘起/缘......
  • 手机旋转的时候 activity会走什么生命周期?
    当手机旋转时,Activity的生命周期会受到影响,但具体行为取决于是否在AndroidManifest.xml文件中对Activity进行了特定的配置。以下是两种不同配置下的生命周期行为:未配置android:configChanges如果未在AndroidManifest.xml中为Activity配置android:configChanges属性,当手机......
  • vue3.0生命周期
    最近要面试,复习一下生命周期的知识点:beforeCreate在组件实例初始化完成之后立即调用created在组件实例处理完所有与状态相关的选项后调用。当这个钩子被调用时,以下内容已经设置完成:响应式数据、计算属性、方法和侦听器。然而,此时挂载阶段还未开始,因此 $el 属性仍不可用。b......
  • 化繁为简,使用 ADManager Plus 简化账户生命周期管理
    在IT环境中,编排指的是对工作流、应用程序和系统的协调管理,旨在通过简化流程来优化业务性能。IT管理员可以通过编排,从单个控制台自动执行一系列任务,例如预配账户帐户、数据库管理、事件处理、应用程序和云资源管理。编排对支持分布于本地和云端的IT服务的大型工作流至关重要。......
  • React 类组件的生命周期
    React类组件的生命周期可以分成三个阶段:挂载(Mounting)阶段:当组件实例被创建并插入DOM中时,会调用的方法。更新(Updating)阶段:当组件的props或state发生变化时会调用的方法。卸载(Unmounting)阶段:当组件从DOM中移除时会调用的方法。以下是每个阶段典型的生命......