`
jiagou
  • 浏览: 2595295 次
文章分类
社区版块
存档分类
最新评论

spring源码学习之路---深度分析IOC容器初始化过程(四)

 
阅读更多

作者:zuoxiaolong8810(左潇龙),转载请注明出处。

最近由于工作和生活,学习耽搁了几天,今天我们继续接着上一章,分析FileSystemXmlApplicationContext的构造函数,到底都做了什么,导致IOC容器初始化成功。

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {

		super(parent);
		setConfigLocations(configLocations);
		if (refresh) {
			refresh();
		}
	}

我们跟踪上一章FileSystemXmlApplicationContext的构造函数,可以发现它最终调用的是上面这个形式重载的构造函数,其中的refresh方法,便是IOC容器初始化的入口。下面我们继续跟踪代码进去看一下refresh方法。refresh方法位于AbstractApplicationContext中,这是一个抽象类,初步实现了ApplicationContext的一般功能,并且这里使用了模板模式,给以后要实现的子类提供了统一的模板。

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				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.
				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.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}

这里面列出了IOC容器初始化的大致步骤,第一步很容易看出来是初始化准备,这个方法里只是设置了一个活动标识,我们主要来看第二步,obtainFreshBeanFactory这个方法,它是用来告诉子类刷新内部的bean工厂,接下来我们跟踪进去看看。

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		refreshBeanFactory();
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	}

该方法中第一句便调用了另外一个refreshBeanFactory方法,这个方法是AbstractApplicationContext中的抽象方法,具体的实现并没有在这个抽象类中实现,而是留给了子类,我们追踪到这个子类当中去看一下。该方法又子类AbstractRefreshableApplicationContext实现,我们来看

protected final void refreshBeanFactory() throws BeansException {
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

方法加上了final关键字,也就是说此方法不可被重写,可以很清楚的看到,IOC容器的初始化就是在这个方法里发生的,第一步先是判断有无现有的工厂,有的话便会将其摧毁,否则,就会创建一个默认的bean工厂,也就是前面提到的DefaultListableBeanFactory,注意看loadBeanDefinitions(beanFactory);这里,当我们创建了一个默认的bean工厂以后,便是载入bean的定义。这与我们上一章所使用的原始的创建bean工厂的方式极为相似。

看到这里,其实不难看出,FileSystemXmlApplicationContext的初始化方法中,其实已经包含了我们上一章当中原始的创建过程,这个类是一个现有的,spring已经为我们实现好的BeanFactory的实现类。在项目当中,我们经常会用到。

今天天色已晚,改天鄙人带着各位去看一下IOC容器建立的要义,也就是载入bean定义的实现。



分享到:
评论

相关推荐

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

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

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

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

    java毕业设计&课设-spring源码深度解析+注解开发全套视频教程(视频+源码).doc

    ### Java毕业设计&课设——Spring源码深度解析+注解开发全套视频教程知识点概览 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一款开源轻量级Java EE应用框架,旨在简化企业级应用的开发过程。Spring...

    Java进阶之SpringIoC源码深度剖析共19页.pd

    【标题】"Java进阶之SpringIoC源码深度剖析共19页.pd" 提供的是一项关于Java开发中的高级主题,特别是针对Spring框架的依赖注入(Inversion of Control,IoC)部分的深入研究。Spring IoC是Spring框架的核心特性之一...

    Spring源码解读.pptx

    Spring Framework的源码解读是一个复杂而深邃的主题,涵盖了诸如Bean的生命周期管理、AOP的实现、IoC容器的工作原理、事件模型等多个方面。理解这些概念不仅有助于提升我们的编码技能,还能帮助我们更好地设计和维护...

    spring-framework-4.3.0-rc1源码

    IoC容器的核心类`org.springframework.beans.factory.BeanFactory`和`org.springframework.context.ApplicationContext`提供了bean的实例化、初始化、装配和管理功能。通过`ApplicationContext`,我们可以获取到bean...

    spring5源码学习

    1. Spring Boot:Spring5与Spring Boot结合,简化项目初始化和配置,源码学习能深入理解自动配置机制。 2. Spring Cloud:在微服务架构中,Spring Cloud提供了服务发现、配置中心、负载均衡等功能,源码分析有助于...

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

    理解Spring源码有助于提升对框架原理的掌握,例如可以研究BeanFactory的初始化过程、AOP的代理模式实现、MVC的请求处理流程等。通过阅读源码,我们可以学习到如何优雅地设计和实现大型框架,提升自身的编程水平。 ...

    spring源码深入解析

    4. **IoC容器的生命周期管理**:Spring容器负责Bean的初始化、属性注入、销毁等生命周期管理。开发者可以通过定义初始化方法、销毁方法,以及配置作用域(单例、原型等)来控制Bean的生命周期。 5. **Spring MVC**...

    spring高级源码分析

    最后,Spring Boot是快速构建Spring应用的工具,它集成了大量默认配置,简化了项目初始化和运行过程。Spring Boot启动器(Starters)按需引入依赖,自动配置Spring Bean。源码分析有助于我们理解其默认配置的原理,...

    lijie_study-spring-framework-v5.2.0.RELEASE.zip

    在源码中,`org.springframework.beans.factory` 和 `org.springframework.context` 包中的类如`BeanFactory`、`ApplicationContext`扮演着IoC容器的角色,负责bean的创建、初始化、装配和管理。 二、AOP(Aspect-...

    程序员编程指南 - Java、Spring、SpringBoot等等基础-进阶-源码知识点 & 面试宝典 - 建议使用Obsi

    SpringBoot是Spring框架的简化版,它旨在简化初始化和配置过程,让开发者能够快速启动项目。基础学习应掌握创建Spring Boot项目、使用starter dependencies、配置文件的应用。进阶内容包括Actuator的健康检查、端点...

    spring3.1.2源码包

    四、源码学习价值 理解Spring的源码,可以帮助我们: 1. 掌握Spring的工作原理,优化代码设计。 2. 自定义扩展,满足特定需求。 3. 提升问题排查能力,理解异常背后的深层次原因。 总结,Spring 3.1.2源码的学习是...

    Spring-Source-Notes:Spring原始深度解析笔记-源码解析

    - Spring的IOC容器通过读取配置元数据(如XML、Java注解或Java配置类)来创建和管理对象,负责对象的生命周期管理,包括实例化、初始化、装配以及销毁对象。 - 源码中,`BeanFactory`是IOC容器的基础接口,提供...

    Spring5 源码分析2020.zip

    这份《Spring5 源码分析2020》的学习笔记很可能涵盖了上述内容的深入剖析,包括Spring容器的初始化过程、Bean的生命周期管理、AOP的实现机制、IoC的源码解析,以及Spring MVC和WebFlux的工作流程等。通过阅读这份...

    spring-analysis-master.zip

    总结,Spring框架的深度分析涵盖了其核心模块、Web开发、数据访问、事务管理等多个方面,通过学习和理解这些组件,开发者可以更好地运用Spring来构建高效、可维护的大型企业级应用。同时,Spring Boot和Spring Cloud...

    spring-framework-master

    Spring Boot简化了Spring应用的初始化和配置,而Spring Cloud则构建了一整套微服务解决方案,包括服务发现、负载均衡、配置中心等。 总之,"spring-framework-master"提供的源码不仅让我们有机会深入理解Spring框架...

    spring源码视频教程

    本"Spring源码视频教程"将详细讲解上述概念,通过对源码的深度解析,帮助学习者了解Spring如何实现这些功能,提升对Spring框架的理解和应用能力。从Bean的创建过程,到AOP的织入机制,再到IoC容器的工作流程,每个...

    spring-analysis-源码.rar

    Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置或注解,我们可以定义bean的创建方式和依赖关系,从而实现控制权的反转,降低组件间的耦合度。 2. **AOP(Aspect Oriented Programming)...

    spring-framework-2.5.6

    《Spring Framework 2.5.6:源码、文档与深度探索》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,自2003年发布以来,因其强大的功能和灵活的设计理念,赢得了广大开发者的心。2.5.6版本是Spring历史...

Global site tag (gtag.js) - Google Analytics