说明:文章按照函数调用的方式一层一层推进,函数结束点击“返回”可以返回至函数调用的地方,另外在函数前有数字1.1。。表示函数的层次关系,由于函数之间的调用关系很复杂,需要忒别注意层次。下面就开始:
IOC容器初始化
一、
1、 应用程序使用 spring 加载 bean 使用语句:
FileSystemXmlApplicationContext
con = new FileSystemXmlApplicationContext (String configLocation);
FileSystemXmlApplicationContext 包括一系列重载的构造方法。最后都会调用下面的方法:
===================================================================
/**
* 这里是 IoC 容器的初始化过程,其初始化过程的大致步骤由类
* AbstractApplicationContext 来定义
*/
public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
/**
* 调用父类构造函数,最终到类 AbstractApplicationContext 中执行下面代码:
* this.parent = parent;
*/
super (parent);
setConfigLocations(configLocations);
/**
* 这里是 IoC 容器的初始化过程,其初始化过程的大致步骤由类
* AbstractApplicationContext 来定义
*/
}
函数执行 ok, 整个容器的初始化就结束了。
过程描述:
1.1 setConfigLocations(configLocations); 方法定义在类:
AbstractRefreshableConfigApplicationContext 。 由类图可知,
FileSystemXmlApplicationContext 间接继承至:
AbstractRefreshableConfigApplicationContext 。 setConfigLocations 方法如下:
===================================================================
public void setConfigLocations(String[] locations) {
if (locations != null ) {
Assert.noNullElements (locations, "Config locations must not be null" );
this . configLocations = new String[locations. length ];
for ( int i = 0; i < locations. length ; i++) {
/**
* 该方法调用 SystemPropertyUtils.resolvePlaceholders(path) ;对 path 中的占位 符进行
* 替换, eg : path 路径中含有 ${user.dir} ,则将替换为: System.getProperty(user.dir);
*/
this . configLocations [i] = resolvePath(locations[i]).trim();
}
} else {
this . configLocations = null ;
}
}
===================================================================
1) 代码中 configLocations 为 AbstractRefreshableConfigApplicationContext 类中 string[] 类型的字段。至此应用程序传入路径保存在 AbstractRefreshableConfigApplicationContext 中 。
1.2 refresh(); 方法定义在类: AbstractApplicationContext ,由类图可知:
FileSystemXmlApplicationContext 间接继承至: AbstractApplicationContext
refresh() 方法如下:
===================================================================
public void refresh() throws BeansException, IllegalStateException {
synchronized ( this . startupShutdownMonitor ) {
/** 为 refresh 做准备 ;*/
/**
* 这里需要子类来协助完成资源位置定义 ,bean 载入和向 IOC 容器注册的过程
*/
Conf igurableListableBeanFactory beanFactory = obtainFreshBeanFactory() ;
// 为当前上下文准备 bean 工厂;
prep areBeanFactory(beanFactory);
try {
// 允许在子类中对 bean 工厂做准备后的处理;
postProcessBeanFactory(beanFactory);
// 调用 bean 工厂处理上下文 bean 的注册 ;
invokeBeanFactoryPostProcessors(beanFactory);
// 注册 bean 创建拦截器的处理。
registerBeanPostProcessors(beanFactory);
// 初始化上下文的资源;
initMessageSource();
// 初始化上下文事件的 multicaster ( 多点播送;多路广播;多点传送 ).
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining( 其余 ) (non-lazy-init ) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event. 发布相应的事件
finishRefresh();
} catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
beanFactory.destroySingletons();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
}
}
过程描述:
1.2.1 prepareRefresh(): 为刷新准备上下文环境。主要设置开始时间和设置 active 标志。
方法如下:
===================================================================
protected void prepareRefresh() {
this . startupDate = System.currentTimeMillis ();
synchronized ( this . activeMonitor ) {
this . active = true ;
}
if ( logger .isInfoEnabled()) {
logger .info ( "Refreshing " + this );
}
}
====================================================================
1.2.2 obtainFreshBeanFactory() :让子类刷新内部 bean 工厂。方法如下:
===================================================================
/**
* 关闭前面所有 bean 工厂,为新的上下文环境初始化一个新的 bean 工厂。这里需要子类来
* 协助完成资源位置定义 ,bean 载入和向 IOC 容器注册的过程
*/
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
Config urableListableBeanFactory beanFactory = getBeanFactory();
if ( logger .isInfoEnabled()) {
logger .info( "Bean factory for application context [" + getId() + "]: " +ObjectUtils.identityToString (beanFactory));
}
if ( logger .isDebugEnabled()) {
logger .debug(beanFactory.getBeanDefinitionCount() + " beans defined in " + this );
}
return beanFactory;
}
====================================================================
1.2.2.1 refreshBeanFactory() 该方法为抽象方法。要求子类必须实现这个方法来执行实际的配置装。在 AbstractApplicationContext 的直接子类:
AbstractRefreshableApplicationContext 中有实现。方法声明为 final ,不允许子类重写方法,方法如下:
====================================================================
protected final void refreshBeanFactory() throws BeansException {
/**
* 判断上下文是否还拥有 bean 工厂。 return (this.beanFactory != null);
*/
if (hasBeanFactory()) {
/**
* 清除当前上下文的所有 bean ,默认的实现为:清除当前上下文的所有缓存的单例 bean ,默认
* 的实现在父类: AbstractApplicationContext ,
*/
// 关闭 bean 工厂,代码: this.beanFactory = null;
closeBeanFactory();
}
try {
// 创建一个 bean 工厂
DefaultListableBeanFactory beanFactory = createBeanFactory() ;
/** 制定 bean 工厂,即设置 bean 工厂的属性值,即:
*beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinit
*onOverriding.booleanValue());
*beanFactory.setAllowCircularReferences(this.allowCircularReference
*s.booleanValue());
*/
customizeBeanFactory(beanFactory);
/**
* 给给定的 bean 工厂装载的 bean 定义,通常是通过委托给一个或多个 * BeanDefinitionReader ,在 AbstractRefreshableApplicationContext 类定义为抽 * 象函数,在
*AbstractXmlApplicationContext 中定义了具体的实现。
*/
loadBeanDefinitions(beanFactory);
synchronized ( this . beanFactoryMonitor ) {
this . beanFactory = beanFactory;
}
} catch (IOException ex) {
throw new ApplicationContextException(
"I/O error parsing XML document for application context [" + getDisplayName() + "]" , ex);
}
====================================================================
本站支持 pay for your wishes
相关推荐
### Spring源码分析_Spring_IOC:深入理解Spring的IOC容器机制 #### 基本概念与核心作用 在探讨Spring框架的核心组件之一——IOC(Inversion of Control,控制反转)容器之前,首先需要理解它在Spring框架中的角色...
Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC...IOC 容器的初始化流程是 Spring 框架中的关键部分,用于将资源配置文件中的信息加载到 IOC 容器中。
3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...
《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...
根据提供的文件信息,本次解读将围绕Spring框架的核心概念与源码分析进行展开。Spring框架作为Java企业级开发中不可或缺的一部分,其源码的学习对于深入理解框架机制、提高开发效率具有重要意义。下面,我们将从以下...
通过分析BeanFactory,我们可以了解对象的创建、初始化和依赖注入过程。 - **AOP**:面向切面编程允许我们定义横切关注点,如日志记录、事务管理,然后将其模块化为可重用的组件。 - **Data Access/...
文档可能将深入探讨Spring IoC容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...
Spring Core负责基础的IoC(Inversion of Control)容器,Spring Beans则实现了Bean的生命周期管理和配置,Spring Context则是基于Core之上构建的,提供了一个应用上下文,可以管理Bean并与其他Spring模块集成。...
在本系列的第一篇【框架源码篇 01】中,我们将深入探讨Spring框架的核心组件——控制反转(Inversion of Control,简称IOC)。IOC是一种设计模式,它将对象的创建和管理职责从应用代码中解耦出来,转交给一个外部...
1. **ApplicationContext**:这是Spring的核心接口,负责初始化、加载配置文件,管理Bean的生命周期。源码中可以看到它是如何解析XML或Java配置,创建并管理Bean的。 2. **BeanFactory**:作为ApplicationContext的...
2. **Spring Beans**:实现了IoC容器,通过XML或注解方式配置bean,并负责bean的初始化、装配和销毁。 3. **Spring AOP**:面向切面编程模块,允许定义方法拦截器和切入点,实现代码的解耦和模块化。 4. **Spring ...
IoC容器是Spring框架的心脏,它负责管理对象的生命周期和依赖关系,使得开发者能够实现松耦合和高可测试性的应用程序。 首先,我们来理解什么是IoC。IoC,也被称为依赖注入(Dependency Injection),是一种设计...
通过阅读和学习这些源码,开发者可以了解到Spring如何实现IoC容器、AOP代理、事件机制、任务调度等多个关键功能。同时,这也有助于开发者更好地理解和使用Spring提供的API,以及在实际项目中如何定制和扩展Spring。 ...
1. **初始化流程**:从`org.springframework.context.support.ClassPathXmlApplicationContext`或`org.springframework.web.context.ContextLoader`开始,理解如何加载配置并创建Bean定义。 2. **依赖注入**:研究`...
在深入探讨Spring框架的核心组件和工作...在分析或运行Spring源码时,确保正确引入这两个库是确保项目正常运行的关键。通过深入了解这些工具库,开发者可以更好地理解和运用Spring框架,从而提高开发效率和应用性能。
1. 性能优化:Spring 5.3.29版本对多个组件进行了性能优化,例如在IoC容器启动速度、AOP代理效率等方面都有所提升,这使得应用程序的运行更加高效。 2. 支持Java新特性:随着Java版本的更新,Spring也不断跟进,...
本文将基于Spring 2.0版本的源码,深入分析Spring IOC容器的内部实现机制,帮助读者更好地理解和使用这一强大的工具。 #### 二、核心概念与术语 在深入探讨Spring IOC容器之前,我们首先需要了解几个核心的概念: ...
通过配置文件或者注解,开发者可以定义对象及其依赖关系,Spring容器会自动管理这些对象的生命周期,包括实例化、初始化、装配和销毁。 **Bean** 在Spring中,业务逻辑的组件被称为Bean。Bean是Spring容器管理的...
《简易Spring-ioc详解》 在Java开发领域,Spring框架以其强大的功能和广泛的应用而备受开发者喜爱。...此外,掌握这些核心概念后,无论是使用Spring框架还是其他类似的IoC容器,都将更加得心应手。