`

spring 源码分析--IOC容器初始化二

阅读更多

接下去说,上一次最后一个函数里面有三个函数调用,即

destroyBeans();   createBeanFactory()loadBeanDefinitions(beanFactory);

这次继续说第一个函数:

  

1.2.2.1.1   destroyBeans() 清除当前上下文的所有 bean ,默认的实现为:清除当前上下文的所有缓存的单例 bean ,默认的实现在父类: AbstractApplicationContext ,代码为:

     getBeanFactory (). destroySingletons ();

其中: getBeanFactory () 在子类 AbstractRefreshableApplicationContext 中实现,返回该类的一个

DefaultListableBeanFactory 类型的 字段 beanFactory ;

其中: destroySingletons () 定义在接口 ConfigurableBeanFactory 中,由类图发现 DefaultListableBeanFactory 实现了 ConfigurableBeanFactory 接口,该方法在其父类: DefaultSingletonBeanRegistry 里有实现。定义如下:

====================================================================

public void destroySingletons() {

    if ( logger .isInfoEnabled()) {

       logger .info( "Destroying singletons in " + this );    

}

 

/** singletonObjects 为一个 MAP 对象,缓存当前的单体实例。 */

 

    synchronized ( this . singletonObjects ) {

/**

*   singletonsCurrentlyInDestruction 我们目前是否在 destroySingletons

*/

       this . singletonsCurrentlyInDestruction = true ;

    }

/**

*   disposableBeans 为一个 MAP 对象,缓存当前的一次性 bean

*/

    synchronized ( this . disposableBeans ) {

String[] disposableBeanNames = StringUtils.toStringArray ( this . disposableBeans .keySet());

       for ( int i = disposableBeanNames. length - 1; i >= 0; i--) {

           destroySingleton(disposableBeanNames[i]);

       }

    }

this . containedBeanMap .clear();

     this . dependentBeanMap .clear();

     this . dependenciesForBeanMap .clear();

     synchronized ( this . singletonObjects ) {

       this . singletonObjects .clear();

       this . singletonFactories .clear();

       this . earlySingletonObjects .clear();

       this . registeredSingletons .clear();

       this . singletonsCurrentlyInDestruction = false ;

    }

}

====================================================================

 

 

1.2.2.1.1.1 destroySingleton(disposableBeanNames[i]) : 如果给定的 bean 存在则,销毁给定的 bean ,定义如下:

====================================================================

public void destroySingleton(String beanName) {

    // 根据给定的名字删除给定 bean

    removeSingleton(beanName);

    // 销毁相应的一次性 bean 实例

    DisposableBean disposableBean = null ;

    synchronized ( this . disposableBeans ) {

disposableBean = (DisposableBean) this . disposableBeans .remove(beanName);

    }

    destroyBean(beanName, disposableBean);

}

====================================================================

返回

 

1.2.2.1.1.1.1 protected void removeSingleton(String beanName) :从当前的 factory 中删除给定名字的 bean 。定义如下:

singletonObjects— 缓存单例 bean map

singletonFactories— 缓存单例工厂 bean map

earlySingletonObjects— 缓存早期的单例 bean map

registeredSingletons— 注册的单例 bean 名字的集合,按照注册的顺序存放的 Set

 

====================================================================

protected void removeSingleton(String beanName) {

    synchronized ( this . singletonObjects ) {

       this . singletonObjects .remove(beanName);

       this . singletonFactories .remove(beanName);

       this . earlySingletonObjects .remove(beanName);

       this . registeredSingletons .remove(beanName);

    }

}

====================================================================

返回

 

 

1.2.2.1.1.1.2 destroyBean (beanName, disposableBean); 先销毁依赖于给定 bean bean ,再销毁给定的 bean 。代码如下:

====================================================================

protected void destroyBean(String beanName, DisposableBean bean) {

    // 首先销毁依赖 bean

    // dependentBeanMap—bean name 和依赖于该 bean bean name 的集合的 map

    Set dependencies = (Set ) this . dependentBeanMap .remove(beanName);

    if (dependencies != null ) {

        if ( logger .isDebugEnabled()) {

logger .debug( "Retrieved dependent beans for bean '" + beanName + "': " + dependencies);

       }

       for (Iterator it = dependencies.iterator(); it.hasNext();) {

           String dependentBeanName = (String) it.next();

// 递归调用

           destroySingleton(dependentBeanName);

       }

    }

// 真正开始销毁 bean

    if (bean != null ) {

       try {

           bean.destroy();

       }

       catch (Throwable ex) {

logger .error( "Destroy method on bean with name '" + beanName + "' threw an exception" , ex);

       }

    }

// 触发销毁包含的 bean

    // containedBeanMap—bean name 和该 bean 所包含的 bean name 的集合的 map

    Set containedBeans = (Set ) this . containedBeanMap .remove(beanName);

    if (containedBeans != null ) {

       for (Iterator it = containedBeans.iterator(); it.hasNext();) {

           String containedBeanName = (String) it.next();

/ 递归调用

destroySingleton(containedBeanName);

       }

    }

    // Remove destroyed bean from other beans' dependencies.

    synchronized ( this . dependentBeanMap ) {

       for (Iterator it = this . dependentBeanMap .entrySet().iterator(); it.hasNext();) {

           Map.Entry entry = (Map.Entry ) it.next();

           Set dependenciesToClean = (Set ) entry.getValue();

           dependenciesToClean.remove(beanName);

           if (dependenciesToClean.isEmpty()) {

              it.remove();

           }

       }

    }

    // Remove destroyed bean's prepared dependency information.

   // dependenciesForBeanMap—bean name 和该 bean 的依赖关系的 bean name 集合的 map

    this . dependenciesForBeanMap .remove(beanName);

 

}

====================================================================

返回

 

 

本站支持 pay for your wishes

1
0
分享到:
评论
1 楼 lixia0417 2016-01-22  
条理很清晰啊。看着舒服。

相关推荐

    Spring源码分析_Spring_IOC

    ### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC...IOC 容器的初始化流程是 Spring 框架中的关键部分,用于将资源配置文件中的信息加载到 IOC 容器中。

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...

    Spring IOC容器实现分析.pdf 下载

    《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...

    spring源码解读-地址.txt

    根据提供的文件信息,本次解读将围绕Spring框架的核心概念与源码分析进行展开。Spring框架作为Java企业级开发中不可或缺的一部分,其源码的学习对于深入理解框架机制、提高开发效率具有重要意义。下面,我们将从以下...

    官方原版源码spring-framework-5.1.13.RELEASE.zip

    通过分析BeanFactory,我们可以了解对象的创建、初始化和依赖注入过程。 - **AOP**:面向切面编程允许我们定义横切关注点,如日志记录、事务管理,然后将其模块化为可重用的组件。 - **Data Access/...

    Spring IoC源码深度剖析开源架构源码2021.pdf

    文档可能将深入探讨Spring IoC容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...

    官方原版源码 spring-framework-5.1.15.RELEASE.zip

    2. 提升了性能,尤其是在初始化和装配阶段,通过优化算法和减少不必要的对象创建,提高了运行效率。 3. 强化了安全特性,包括对Spring Security的升级和集成,增强了对OAuth2、JWT等身份验证和授权机制的支持。 4. ...

    【框架源码篇 01】Spring源码-手写IOC

    5. **Bean管理**:最后,容器会管理Bean的生命周期,包括初始化、使用和销毁。 在实际开发中,Spring使用了更加高效和灵活的方式来实现这些功能,比如使用`ApplicationContext`接口作为IOC容器的入口,以及`...

    官方原版源码 spring-framework-5.2.9.RELEASE.zip

    1. **ApplicationContext**:这是Spring的核心接口,负责初始化、加载配置文件,管理Bean的生命周期。源码中可以看到它是如何解析XML或Java配置,创建并管理Bean的。 2. **BeanFactory**:作为ApplicationContext的...

    官方原版源码spring-framework-5.1.0.RELEASE.zip

    2. **Spring Beans**:实现了IoC容器,通过XML或注解方式配置bean,并负责bean的初始化、装配和销毁。 3. **Spring AOP**:面向切面编程模块,允许定义方法拦截器和切入点,实现代码的解耦和模块化。 4. **Spring ...

    官方原版源码spring-framework-5.0.13.RELEASE.zip

    1. **初始化流程**:从`org.springframework.context.support.ClassPathXmlApplicationContext`或`org.springframework.web.context.ContextLoader`开始,理解如何加载配置并创建Bean定义。 2. **依赖注入**:研究`...

    spring-framework-2.5-rc2-with-dependencies\spring-framework-2.5-rc2\spring-framework-2.5-rc2源代码

    通过阅读和学习这些源码,开发者可以了解到Spring如何实现IoC容器、AOP代理、事件机制、任务调度等多个关键功能。同时,这也有助于开发者更好地理解和使用Spring提供的API,以及在实际项目中如何定制和扩展Spring。 ...

    spring-cglib-repack-3.2.6.jar和spring-objenesis-repack-2.6.jar

    在深入探讨Spring框架的核心组件和工作...在分析或运行Spring源码时,确保正确引入这两个库是确保项目正常运行的关键。通过深入了解这些工具库,开发者可以更好地理解和运用Spring框架,从而提高开发效率和应用性能。

    Spring2.5.6源代码分析(一):IOC容器

    IoC容器是Spring框架的心脏,它负责管理对象的生命周期和依赖关系,使得开发者能够实现松耦合和高可测试性的应用程序。 首先,我们来理解什么是IoC。IoC,也被称为依赖注入(Dependency Injection),是一种设计...

    spring-framework-5.3.29.tar.gz

    通过XML配置文件或Java注解,我们可以定义bean的创建、初始化和销毁过程,实现依赖注入,从而降低代码的耦合度。 2. AOP:Spring的AOP模块允许开发者定义横切关注点,如日志记录、事务管理等,将这些关注点与业务...

    Spring 5.2.9的IOC核心jar包

    通过配置文件或者注解,开发者可以定义对象及其依赖关系,Spring容器会自动管理这些对象的生命周期,包括实例化、初始化、装配和销毁。 **Bean** 在Spring中,业务逻辑的组件被称为Bean。Bean是Spring容器管理的...

    Spring IOC容器实现分析

    本文将基于Spring 2.0版本的源码,深入分析Spring IOC容器的内部实现机制,帮助读者更好地理解和使用这一强大的工具。 #### 二、核心概念与术语 在深入探讨Spring IOC容器之前,我们首先需要了解几个核心的概念: ...

    coco-spring-ioc

    《简易Spring-ioc详解》 在Java开发领域,Spring框架以其强大的功能和广泛的应用而备受开发者喜爱。...此外,掌握这些核心概念后,无论是使用Spring框架还是其他类似的IoC容器,都将更加得心应手。

Global site tag (gtag.js) - Google Analytics