首页 > 其他分享 >Spring容器系列-启动原理(下)

Spring容器系列-启动原理(下)

时间:2024-06-17 17:43:25浏览次数:12  
标签:容器 系列 BeanFactory Spring 接口 Bean BeanDefinition

Spring容器系列-启动原理(下)

   从上一篇文章《Spring容器系列-启动原理(上)》中,介绍了Spring容器初始化的核心方法refresh()的整体情况。这篇文章来详细展开介绍。其中比较重要的方法会标记上***

   一、refresh中的12个方法

   1.  prepareRefresh

   主要作用:记录下容器启动时间,标记"已启动"状态
   2. obtainFreshBeanFactory ***

   主要作用:创建bean工厂,如果已经有则销毁,没有则创建。将配置文件解析成一个个 Bean 定义,注册到 BeanFactory中。

   里面实现对beanDefinition的装载(说到底核心是一个key为beanName,value为beanDefinition的 map)

   说明:获取到的是DefaultListableBeanFactory类的实例

   3. prepareBeanFactory ***

   主要作用:设置BeanFactory的类加载器,添加一些默认的后置处理器,添加默认的系统环境bean:环境配置、系统属性、系统环境变量

   说明:上一步obtainFreshBeanFactory已经把工厂建好了,但是还不能投入使用,因为工厂里什么都没有,还需要配置一些东西

   4. postProcessBeanFactory ***

   主要作用:空方法 - 模版方法,由子类重写。让子类有机会在BeanFactory准备就绪后对其进行进一步的处理或配置:例如添加自定义的BeanPostProcessor、注册特定类型的Bean等。

   说明:这里采用模版方法设计模式,空方法,留给子类来实现

   5. invokeBeanFactoryPostProcessors ***

   主要作用:在应用上下文中调用所有注册的 BeanFactoryPostProcessor 实现类的 postProcessBeanFactory 方法,以便对 BeanFactory 进行进一步的定制和处理

   说明:通常情况下,开发者可以通过实现 BeanFactoryPostProcessor 接口,在 postProcessBeanFactory 方法中编写自己的定制逻辑,以满足特定的需求。当调用 invokeBeanFactoryPostProcessors(beanFactory) 方法时,Spring 将自动扫描并调用所有注册的 BeanFactoryPostProcessor 的 postProcessBeanFactory 方法,完成容器的预处理工作。

   6.  registerBeanPostProcessors ***

   主要作用:将自定义的配置文件中的BeanPostProcessor提取出来并注册进入beanFactory

   说明:这些后置处理器实现了 BeanPostProcessor 接口,用于在容器中的 Bean 创建、初始化、销毁等生命周期阶段进行特定操作。通过注册后置处理器,可以对容器中的 Bean 进行额外的处理,例如,AOP 切面的织入、自定义注解的处理、事件监听等。

   注册后置处理器是 Spring 框架实现灵活性和扩展性的重要手段之一,可以让开发者根据具体需求定制自己的处理逻辑,并将其无缝地集成到 Spring 容器中。

   在 Spring 中,注册后置处理器时会按照以下顺序进行排序:

   首先,将实现了 PriorityOrdered 接口的后置处理器添加到 priorityOrderedPostProcessors 集合中,并按照 Ordered 接口或 @Order 注解的顺序进行排序。

   然后,将实现了 Ordered 接口或使用 @Order 注解标注的后置处理器添加到 orderedPostProcessorNames 集合中。

   最后,将未实现以上接口或注解的后置处理器添加到 nonOrderedPostProcessorNames 集合中。

   后置处理器的类型包括:

   实现了 BeanPostProcessor 接口的后置处理器,用于在 Bean 实例化、依赖注入和初始化阶段对 Bean 进行额外的处理。

   实现了 BeanFactoryPostProcessor 接口的后置处理器,用于在 BeanFactory 标准初始化后对 BeanFactory 进行额外的处理。

   实现了 MergedBeanDefinitionPostProcessor 接口的后置处理器,用于在 Bean 定义合并前后对 Bean 进行额外的处理。

   MergedBeanDefinitionPostProcessor 接口是 BeanFactoryPostProcessor 的一个子接口,用于在 Bean 定义合并阶段进行操作,例如,可以通过这个后置处理器修改 Bean 的定义信息。

   7.  initMessageSource

   主要作用:初始化消息源,为 Spring 应用程序的国际化功能提供支持

   8.  initApplicationEventMulticaster

   主要作用:初始化事件管理类

   9.  onRefresh

   主要作用:模版方法,由子类重写。用于在容器刷新时执行特定的自定义操作:如创建Tomcat,Jetty等WEB服务器

   说明:在该方法中,可以添加任何希望在容器刷新完成后执行的逻辑,比如启动定时任务、初始化缓存、加载配置文件等等。通过重写这个方法,可以扩展容器刷新的行为,使得容器更适应特定的应用场景或业务需求。

   10.  registerListeners

   主要作用:注册监听器

   11.  finishBeanFactoryInitialization *** 

   主要作用:实例化所有剩余的(非懒加载)的单例 Bean

   12.  finishRefresh

 主要作用:完成应用程序的上下文刷新,其中包括:完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人


二、refresh()方法中比较重要的类/接口进行梳理

    1. BeanFactory 接口

    BeanFactory 是用于管理Bean的工厂,它负责创建、解析和管理Bean对象。在容器启动时,会先创建 BeanFactory,然后根据配置信息加载并初始化 Bean。

    2. BeanDefinition 接口

    Spring 实例化要通过 BeanDefinition。因为Class 是无法完成 bean 的抽象,比如 bean 的作用域,bean 的注入模型,bean 是否是懒加载等等信息,Class是无法抽象出来的,故而需要一个 BeanDefinition 类来抽象这些信息。

    BeanDefinition类图如下:


   3.  BeanDefinitionRegistry 接口

   BeanDefinitionRegistry 是 Spring 框架中的一个接口,用于注册和管理 BeanDefinition,即用于定义和描述 Spring 中的 Bean。

   BeanDefinitionRegistry 接口定义了一系列方法,包括注册、移除、检索 BeanDefinition 等。通过这些方法,可以向 Spring 容器注册各种类型的 BeanDefinition,包括单例、原型、懒加载等,并指定它们的依赖关系、作用域、初始化方法、销毁方法等。
通过使用 BeanDefinitionRegistry,开发人员可以动态地向 Spring 容器注册新的 BeanDefinition,从而实现灵活的 IoC(控制反转)和 DI(依赖注入)功能

 

registerBeanDefinition
往 BeanFactory 中注册 BeanDefinition

 


 

1)属性:beanDefinitionMap

 


 

/org/springframework/beans/factory/support/DefaultListableBeanFactory.java:164

 


 

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

 


 

用于存储 Bean 名称和对应的 BeanDefinition 对象

 


 

2)方法:registerBeanDefinition()
负责管理 Spring IoC 容器中的 BeanDefinition,确保每个 Bean 都有一个唯一的名称,并处理覆盖和更新 BeanDefinition 的逻辑。

 

  4. ConfigurableListableBeanFactory 接口
   它继承自 ListableBeanFactory 和 ConfigurableBeanFactory 接口,主要用于配置和管理 BeanFactory。
总的来说,ConfigurableListableBeanFactory 提供了对 Spring IoC 容器的高级配置和管理功能,是 Spring 中 BeanFactory 的一个可配置的扩展接口。


   4.  DefaultListableBeanFactory 类

   它是Spring 框架中最常用的 IOC 容器实现之一,它支持 XML 配置和基于注解的配置,并提供了丰富的功能和灵活性,因此被广泛应用于各种类型的 Spring 应用中。

   它实现了 ConfigurableListableBeanFactory 和 BeanDefinitionRegistry 接口,提供了对 Bean 的定义和管理的基本功能。

   DefaultListableBeanFactory 是一个基本功能的 BeanFactory,它实现了 BeanDefinitionRegistry 接口。它的继承结构如下:

 

 

 

 


 

 


5. BeanDefinition 接口
BeanDefinition 用于描述和定义 Bean 的属性、行为以及依赖关系等信息。



6.BeanFactoryPostProcessor 接口
BeanFactoryPostProcessor 负责在 BeanFactory 加载 BeanDefinition 之后,但在 Bean 实例化之前,对 BeanFactory 进行后处理。这样可以在容器启动过程中对 BeanFactory 进行修改,比如注册自定义的 BeanDefinition,修改属性值,添加属性转换器等。



7. ApplicationContext 接口


ApplicationContext 实际上是 BeanFactory 的一个子接口,它扩展了 BeanFactory 的功能,提供了更多的企业级特性,比如国际化、事件发布、应用上下文的层级结构等。在 Spring 中,ApplicationContext 是 Spring IoC 容器的一种,而 BeanFactory 是 IoC 容器的基础接口。


ApplicationContext 不直接暴露 BeanFactory 的所有功能,而是通过代理模式对其进行封装和增强,使其具有更多的功能。这种封装和增强的方式让 ApplicationContext 具有了更强大的特性,比如自动装配、AOP(面向切面编程)、事件处理等,从而更适合于企业级应用的开发。


8. PostProcessorRegistrationDelegate 类
是 Spring 框架中用于处理后置处理器(BeanPostProcessor)的注册工具类。其主要作用是负责管理后置处理器的注册和执行顺序

 




标签:容器,系列,BeanFactory,Spring,接口,Bean,BeanDefinition
From: https://www.cnblogs.com/hld123/p/18252900

相关文章

  • Spring-AOP概述
    1.AOP的基本概念AOP:面向切面编程(AspectOrientedProgramming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术AOP的作用:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率没......
  • 基于springboot的南门桥社区疫情防疫系统-48138(免费领源码+数据库)可做计算机毕业设计J
    Springboot南门桥社区疫情防疫系统的设计与实现摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对南门桥社区疫情防疫系统等问题,对南门桥社区......
  • Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打
    场景Docker+Jenkins+Pipline如何获取git插件环境变量(提交sha、分支等)以及Jenkinsfile中获取sh执行结果(获取git最近提交信息):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139697004在上面的基础上实现了使用Jenkinsfile文件获取git的提交记录以及获取sh的执......
  • 小宋的SpringCloud学习记录day04:DB静态工具
    1.查询用户的同时,查询出用户对应的所有地址在UserVo实体类里面添加一个集合用于接收Address地址@ApiModelProperty("用户收货地址")privateList<AddressVO>addresses; 接下来我们对业务层进行改造,要求我们在查询用户的时候把地址也查出来Controller层:@ApiO......
  • Python工具箱系列(五十三)
    ​​水印水印是一种常见的图片处理需求。当既需要展示,又需要保护知识产权时,就需要使用文字或者图片来打水印。下面的代码展示了文字水印与图片水印的过程。​--javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdownfrompathlibimportPathfromPILimp......
  • 高效开发系列:鸿蒙原生app套用混合app开发思路
    2024年,似乎华为迎来了新的企业机遇--鸿蒙独立操作系统。 受到全球国际形势的影响,加之第四次科技革命(AI革命)冷不丁的出现,在他国AI技术领先的前提下,中国自主研发的独立操作系统再次提上新的战略高度。其中,鸿蒙独立操作系统(HarmonyOS)就是大新创/国产操作系统的新高度。 鸿......
  • 11、docker-dockerfile--构建docker的镜像文件和容器的挂载卷方法 方式二挂载
    挂载方式二:此方式是在生成镜像的同时也实现挂载1、现在本机创建一个目录文件存放脚本·mkdir/home/docker-volume-test2、创建脚本文件·vim  /home/docker-volume-test/dockerfile01·内容如下:FROMcentos//表示......
  • Spring
    Spring**1、Spring框架是什么?Spring框架是一个开源的、轻量级的、基于Java的应用程序开发框架,用于构建企业级应用。它提供了全面的基础设施支持,包括依赖注入(DependencyInjection)、面向切面编程(Aspect-OrientedProgramming)、事务管理(TransactionManagement)、数据访问(Data......
  • Spring容器系列-启动原理
    Spring容器系列-启动原理  Spring具有非常庞大的体系,但无论多大都是由一个个小的模块组合而来,不管是SpringMvc还是SpringBoot,都是在Spring的基础上延伸而来,因此,看源码要找对方向。  我们知道,在SpringBoot之前,对象的管理和配置都是通过XML的方式来实现的,那么Spring是......
  • 游戏原型系列:(1)乒乓广场——续
    书接上回,这一章我们介绍相机抖动、粒子特效、高亮材质等功能实现。一、最终效果二、相机抖动游戏玩法完成后,让我们看看是否能让游戏的展示变得更加有趣。当球击中某物时,让摄像头抖动是一个让玩家感受到强烈冲击的简单方法。这种方式模拟了玩家感受到球击中场地边缘的感觉。......