spring 核心与源码解析(2):IoC之ApplicationContext
来源:互联网 发布:打码刷码软件官方下载 编辑:程序博客网 时间:2024/05/16 01:44
上一节展示了BeanFactory的初始化过程,其主要任务是载入BeanDefinition并通过BeanDefinition初始化bean保存在singletonObjects中。
那么ApplicationContext的任务是什么呢?BeanDefinition的生成并不是由BeanFactory完成的,而是由ApplicationContext相关类完成的。
当我们使用spring boot进行开发时,由于省去了xml配置文件, 项目启动时默认采用的AnnotationConfigEmbeddedWebApplicationContext,其定义如下:
public class AnnotationConfigEmbeddedWebApplicationContext extends EmbeddedWebApplicationContext { private final AnnotatedBeanDefinitionReader reader; private final ClassPathBeanDefinitionScanner scanner; private Class<?>[] annotatedClasses; private String[] basePackages;
AnnotationConfigEmbeddedWebApplicationContext有四个十分重要的属性,AnnotatedBeanDefinitionReader 类型的reader用于生成BeanDifinition,ClassPathBeanDefinitionScanner类型的scanner用于完成扫描的工作,annotatedClasses则存储扫描的类,basePackages是指定要扫描的包。
不同多说,上述四个属性的定义基本为我们揭示了创建BeanDifinition的过程。
另外,AnnotationConfigEmbeddedWebApplicationContext继承的GenericApplicationContext类含有DefaultListableBeanFactory的对象,因此可以认为,Spring boot应用只将ApplicationContext暴露在外,而具体创建类等工作都是在ApplicationContext内部完成的。
顺便一提,AnnotationConfigEmbeddedWebApplicationContext是通过最基本的SpringsourceApplication初始化实现的:
//Main函数public static void main(String[] args) { SpringApplication.run(XXX.class, args);}//SpringApplication中的run方法:public ConfigurableApplicationContext run(String... args) { ... ConfigurableApplicationContext context = null; ... try { ... context = this.createApplicationContext(); ...}//SpringApplication中的createApplicationContext方法:protected ConfigurableApplicationContext createApplicationContext() { Class<?> contextClass = this.applicationContextClass; if(contextClass == null) { try { contextClass = Class.forName(this.webEnvironment?"org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext":"org.springframework.context.annotation.AnnotationConfigApplicationContext"); } catch (ClassNotFoundException var3) { throw new IllegalStateException("Unable create a default ApplicationContext, please specify an ApplicationContextClass", var3); } } return (ConfigurableApplicationContext)BeanUtils.instantiate(contextClass);}
最后,在完成AnnotationConfigEmbeddedWebApplicationContext的创建后,会调用EmbeddedWebApplicationContext的refresh()方法,该方法会一直调用到DefaultListableBeanFactory的getBean方法,这样就回到上一节的内容了。
总的来说,ApplicationContext的功能就到这里了,
在Spring boot刚启动时,会创建ApplicationContext,而ApplicationContext内部又会初始化BeanFactory,然后,ApplicationContext完成扫描包并生成BeanDefinition的过程,将BeanDefinition注册到(register)BeanFactory中。
- spring 核心与源码解析(2):IoC之ApplicationContext
- spring 核心与源码解析(1):IoC之BeanFactory
- Spring Ioc核心源码解析
- (六)Spring核心框架 - IOC的源码解析
- Spring IoC源码解析(1):BeanFactory和ApplicationContext
- Spring源码解析-applicationContext
- Spring源码解析-applicationContext
- Spring IOC核心源码学习(一)
- Spring IOC核心源码学习(一)
- Spring IOC核心源码学习(一)
- 先码后看 spring IOC源码(beanfactory、applicationcontext、webapplicationcontext) 侵立删
- Spring源码阅读之IoC容器初始化2 -- BeanDefinition载入与解析
- Spring 核心之IOC
- Spring核心之IoC
- Spring核心之IoC
- 【Spring源码解析】之IOC容器
- spring ioc 源码解析
- Spring IOC 源码解析
- 理解各种树形结构
- 【知识小结】计算机视觉
- buffer和cache的区别
- 【linux】ldconfig命令用法笔记
- phpexcel将json转excel
- spring 核心与源码解析(2):IoC之ApplicationContext
- gojs去除水印
- docker registry 搭建流程(含CA认证)
- 递归获取文件目录
- html学习记录一
- deeplearning.ai lecture2-week2-optimization methods
- 程序人生
- Android-NDK入门
- 通常的神经网络大小的设计研究,需要多少神经元