作者: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容器初始化、Bean生命周期管理、依赖注入等关键概念,并以2021年的开源版本为背景进行分析。 从提供的部分文档内容来看,我们可以提炼出以下几个知识点: 1. **BeanFactory与...
1. **ApplicationContext**:这是Spring的核心接口,负责初始化、加载配置文件,管理Bean的生命周期。源码中可以看到它是如何解析XML或Java配置,创建并管理Bean的。 2. **BeanFactory**:作为ApplicationContext的...
### Java毕业设计&课设——Spring源码深度解析+注解开发全套视频教程知识点概览 #### 一、Spring框架简介 Spring框架是由Rod Johnson创建的一款开源轻量级Java EE应用框架,旨在简化企业级应用的开发过程。Spring...
【标题】"Java进阶之SpringIoC源码深度剖析共19页.pd" 提供的是一项关于Java开发中的高级主题,特别是针对Spring框架的依赖注入(Inversion of Control,IoC)部分的深入研究。Spring IoC是Spring框架的核心特性之一...
Spring Framework的源码解读是一个复杂而深邃的主题,涵盖了诸如Bean的生命周期管理、AOP的实现、IoC容器的工作原理、事件模型等多个方面。理解这些概念不仅有助于提升我们的编码技能,还能帮助我们更好地设计和维护...
IoC容器的核心类`org.springframework.beans.factory.BeanFactory`和`org.springframework.context.ApplicationContext`提供了bean的实例化、初始化、装配和管理功能。通过`ApplicationContext`,我们可以获取到bean...
1. Spring Boot:Spring5与Spring Boot结合,简化项目初始化和配置,源码学习能深入理解自动配置机制。 2. Spring Cloud:在微服务架构中,Spring Cloud提供了服务发现、配置中心、负载均衡等功能,源码分析有助于...
理解Spring源码有助于提升对框架原理的掌握,例如可以研究BeanFactory的初始化过程、AOP的代理模式实现、MVC的请求处理流程等。通过阅读源码,我们可以学习到如何优雅地设计和实现大型框架,提升自身的编程水平。 ...
4. **IoC容器的生命周期管理**:Spring容器负责Bean的初始化、属性注入、销毁等生命周期管理。开发者可以通过定义初始化方法、销毁方法,以及配置作用域(单例、原型等)来控制Bean的生命周期。 5. **Spring MVC**...
最后,Spring Boot是快速构建Spring应用的工具,它集成了大量默认配置,简化了项目初始化和运行过程。Spring Boot启动器(Starters)按需引入依赖,自动配置Spring Bean。源码分析有助于我们理解其默认配置的原理,...
在源码中,`org.springframework.beans.factory` 和 `org.springframework.context` 包中的类如`BeanFactory`、`ApplicationContext`扮演着IoC容器的角色,负责bean的创建、初始化、装配和管理。 二、AOP(Aspect-...
SpringBoot是Spring框架的简化版,它旨在简化初始化和配置过程,让开发者能够快速启动项目。基础学习应掌握创建Spring Boot项目、使用starter dependencies、配置文件的应用。进阶内容包括Actuator的健康检查、端点...
四、源码学习价值 理解Spring的源码,可以帮助我们: 1. 掌握Spring的工作原理,优化代码设计。 2. 自定义扩展,满足特定需求。 3. 提升问题排查能力,理解异常背后的深层次原因。 总结,Spring 3.1.2源码的学习是...
- Spring的IOC容器通过读取配置元数据(如XML、Java注解或Java配置类)来创建和管理对象,负责对象的生命周期管理,包括实例化、初始化、装配以及销毁对象。 - 源码中,`BeanFactory`是IOC容器的基础接口,提供...
这份《Spring5 源码分析2020》的学习笔记很可能涵盖了上述内容的深入剖析,包括Spring容器的初始化过程、Bean的生命周期管理、AOP的实现机制、IoC的源码解析,以及Spring MVC和WebFlux的工作流程等。通过阅读这份...
总结,Spring框架的深度分析涵盖了其核心模块、Web开发、数据访问、事务管理等多个方面,通过学习和理解这些组件,开发者可以更好地运用Spring来构建高效、可维护的大型企业级应用。同时,Spring Boot和Spring Cloud...
Spring Boot简化了Spring应用的初始化和配置,而Spring Cloud则构建了一整套微服务解决方案,包括服务发现、负载均衡、配置中心等。 总之,"spring-framework-master"提供的源码不仅让我们有机会深入理解Spring框架...
本"Spring源码视频教程"将详细讲解上述概念,通过对源码的深度解析,帮助学习者了解Spring如何实现这些功能,提升对Spring框架的理解和应用能力。从Bean的创建过程,到AOP的织入机制,再到IoC容器的工作流程,每个...
Spring的核心是IoC容器,它负责管理对象的生命周期和依赖关系。通过XML配置或注解,我们可以定义bean的创建方式和依赖关系,从而实现控制权的反转,降低组件间的耦合度。 2. **AOP(Aspect Oriented Programming)...
《Spring Framework 2.5.6:源码、文档与深度探索》 Spring Framework作为Java领域最广泛应用的轻量级框架之一,自2003年发布以来,因其强大的功能和灵活的设计理念,赢得了广大开发者的心。2.5.6版本是Spring历史...