美文网首页
Ioc概述以及总体加载过程

Ioc概述以及总体加载过程

作者: 无限骄傲 | 来源:发表于2020-12-20 02:44 被阅读0次

概述:Spring ioc容器加载过程相对复杂,在阅读源码时候可以将其划分为几个小流程 和一个总体流程,这样对源码的阅读以及理解会简单很多,大体如下:

ioc容器创建主主流程

beanfactory获取子流程

beanDefinition加载过程

bean创建过程

懒加载机制

循环依赖的处理

这里讲述ioc容器的基础知识以及总体流程

一.基础知识

IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现

描述的事情:Java开发领域对象的创建,管理的问题

传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象

IoC思想下开发⽅式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对

象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可

我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列

事情)

为什么叫做控制反转?

控制:指的是对象创建(实例化、管理)的权利

反转:控制权交给外部环境了(spring框架、IoC容器)

 IoC和DI的区别

DI:Dependancy Injection(依赖注⼊)IOC和DI描述的是同⼀件事情,只不过⻆度不⼀样罢了

二.高级特性

lazy-Init 延迟加载

ApplicationContext 容器的默认⾏为是在启动服务器时将所有 singleton bean 提前进⾏实例化。提前

实例化意味着作为初始化过程的⼀部分,ApplicationContext 实例会创建并配置所有的singleton

bean。lazy-init="false",⽴即加载,表示在spring启动时,⽴刻进⾏实例化。

 FactoryBean 和 BeanFactory

BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,

具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;此处我们重点分析FactoryBean

Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean),FactoryBean可以⽣成

某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。

Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似,FactoryBean使⽤较多,尤

其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤

后置处理器

Spring提供了两种后处理bean的扩展接⼝,分别为 BeanPostProcessor 和

BeanFactoryPostProcessor,两者在使⽤上是有所区别的。

⼯⼚初始化(BeanFactory)—> Bean对象

在BeanFactory初始化之后可以使⽤BeanFactoryPostProcessor进⾏后置处理做⼀些事情

在Bean对象实例化(并不是Bean的整个⽣命周期完成)之后可以使⽤BeanPostProcessor进⾏后置处

理做⼀些事情

注意:对象不⼀定是springbean,⽽springbean⼀定是个对象

SpringBean的⽣命周期

BeanPostProcessor:

BeanPostProcessor是针对Bean级别的处理,可以针对某个具体的Bean

该接⼝提供了两个⽅法,分别在Bean的初始化⽅法前和初始化⽅法后执⾏,具体这个初始化⽅法指的是什么⽅法,类似我们在定义bean时,定义了init-method所指定的⽅法,定义⼀个类实现了BeanPostProcessor,默认是会对整个Spring容器中所有的bean进⾏处理。如果要对具体的某个bean处理,可以通过⽅法参数判断,两个类型参数分别为Object和String,第⼀个参数是每个bean的实例,第⼆个参数是每个bean的name或者id属性的值。所以我们可以通过第⼆个参数,来判断我们将要处理的具体的bean。

注意:处理是发⽣在Spring容器的实例化和依赖注⼊之后。

BeanFactoryPostProcessor

beanFactory级别的处理,是针对整个Bean的⼯⼚进⾏处理,

BeanDefinition对象:我们在 XML 中定义的 bean标签,Spring 解析 bean 标签成为⼀个 JavaBean,

这个JavaBean 就是 BeanDefinition

注意:调⽤ BeanFactoryPostProcessor ⽅法时,这时候bean还没有实例化,此时 bean 刚被解析成

BeanDefinition对象

三.ioc容器加载过程

3.1Spring IoC的容器体系

  IoC容器是Spring的核⼼模块,是抽象了对象管理、依赖关系管理的框架解决⽅案。Spring 提供了很多的容器,其中 BeanFactory 是顶层容器(根容器),不能被实例化,它定义了所有 IoC 容器 必须遵从的⼀套原则,具体的容器实现可以增加额外的功能,⽐如我们常⽤到的ApplicationContext,其下更具体的实现ClassPathXmlApplicationContext 包含了解析 xml 等⼀系列的内容.其中beanfactory提供了主体方法,其他接口分别实现他的同时又有自己相对应的一些扩展方法  将相类似的功能分别放在不同接口 避免了大量重写方法的困扰


3.2Spring IoC容器初始化主流程

流程图

Spring IoC 容器初始化的关键环节就在 AbstractApplicationContext#refresh() ⽅法中查看 refresh ⽅法来俯瞰容器创建的主体流程

大致流程如下

@Override

public void refresh()throws BeansException, IllegalStateException {

//对象锁

  synchronized (this.startupShutdownMonitor) {

// Prepare this context for refreshing.

      /**

      * 刷新前做的事情

      * 设置容器的启动开始时间,开启活跃状态 撤销关闭状态

      * 验证环境信息中一些必要的属性

      */

      prepareRefresh();

      // Tell the subclass to refresh the internal bean factory.

      /**

      * 获取beanFactory

      * 加载Bean definition并注册到BeanDefinitionRegister中

      */

      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // Prepare the bean factory for use in this context.

      /**

      * BeanFactory的准备动作 (BeanFactory的一些设置 如Context的加载类等

      */

      prepareBeanFactory(beanFactory);

      try {

// Allows post-processing of the bean factory in context subclasses.

        /**

          * postProcessBeanFactory进行后续工作-->空方法 实现扩展

          */

        postProcessBeanFactory(beanFactory);

        // Invoke factory processors registered as beans in the context.

        /**

          * 实例化BeanFactoryPostProcessor接口Bean,并调用该方法

          */

        invokeBeanFactoryPostProcessors(beanFactory);

        // Register bean processors that intercept bean creation.

        /**

          * 注册BeanPostProcessors 在Bean 实例化前后执行(此时没有bean实例化)

*/

        registerBeanPostProcessors(beanFactory);

        // Initialize message source for this context.

        /**

          * 国际化

          */

        initMessageSource();

        // Initialize event multicaster for this context.

        /**

          * 事件分发

          */

        initApplicationEventMulticaster();

        // Initialize other special beans in specific context subclasses.

        /**

          *  ⼦类重写这个⽅法,在容器刷新的时候可以⾃定义逻辑

          */

        onRefresh();

        // Check for listener beans and register them.

        /**

          * 注册实现ApplicationListeners的监听器

          */

        registerListeners();

        // Instantiate all remaining (non-lazy-init) singletons.

        /**

          * 初始化 所有非懒加载的Bean

          * 初始化所有非懒加载的所有Bean的实例(未进行属性设置)

          * 设置属性值

          * 执行初始化方法(如afterPropertiesSet  init-method等)

          * 执行BeanProcessor对实例进行后置处理

          */

        finishBeanFactoryInitialization(beanFactory);

        // Last step: publish corresponding event.

        /**

          * 完成context的刷新。主要是调⽤LifecycleProcessor的onRefresh()⽅法,并且发布事

          * 件 (ContextRefreshedEvent

*/

        finishRefresh();}

相关文章

网友评论

      本文标题:Ioc概述以及总体加载过程

      本文链接:https://www.haomeiwen.com/subject/tkuhnktx.html