博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring基本执行过程解析
阅读量:4291 次
发布时间:2019-05-27

本文共 2947 字,大约阅读时间需要 9 分钟。

一。基本过程

1.当创建一个上下文:

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");

2.进入ClassPathXmlApplicationContext.java

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)			throws BeansException {		super(parent);//2-1		setConfigLocations(configLocations);//2-2		if (refresh) {			refresh();//2-3		}	}

2-1 :解析super(parent)

主要功能是获取 ResourcePatternResolver

经过层层调用,在AbstractApplicationContext.java中:

this.resourcePatternResolver = getResourcePatternResolver();

getResourcePatternResolver经过查看为:

new PathMatchingResourcePatternResolver(this);

结论:主要作用是设置applicationContext对象的resourcePatternResolver 属性为new PathMatchingResourcePatternResolver(this)

2-2 :setConfigLocations(configLocations)

替换配置文件名称中的占位符

2-3 :见下一节 refresh()详解

二。refresh()详解

进入AbstractApplicationContext # refresh()

synchronized (this.startupShutdownMonitor) {			// 1			prepareRefresh();			// 2			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();			// 3			prepareBeanFactory(beanFactory);			try {				// 4				postProcessBeanFactory(beanFactory);				// 5				invokeBeanFactoryPostProcessors(beanFactory);				// 6				registerBeanPostProcessors(beanFactory);				// 7				initMessageSource();				// 8				initApplicationEventMulticaster();				// 9				onRefresh();				// 10				registerListeners();				// 11				finishBeanFactoryInitialization(beanFactory);				// 12				finishRefresh();			}			catch (BeansException ex) {				logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);				// Destroy already created singletons to avoid dangling resources.				destroyBeans();				// Reset 'active' flag.				cancelRefresh(ex);				// Propagate exception to caller.				throw ex;			}		}
1、prepareRefresh()

进入此方法,可以看到两个比较重要的步骤

 initPropertySources();   //初始化属性源,比如从properties文件中读取,从url读取....这个方法一般交给子类实现

getEnvironment().validateRequiredProperties();    //验证资源中的占位符是否在必要的属性源中都存在,若不存在则抛出异                              常MissingRequiredPropertiesException

2.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()

进入方法 ,比较重要的一段为↓

refreshBeanFactory();    //*****初始化beanDefinitionMap---->加载xml中的<bean>beanDefinition

此时可以 看到alreadyCreated属性数量小于beanDefinitionMap长度

3.prepareBeanFactory(beanFactory);

初始化这个上下文中beanFactory的一些特性

4.postProcessBeanFactory(beanFactory);

对这个beanFactory进行后处理,由子类实现

5.invokeBeanFactoryPostProcessors(beanFactory);

调用beanFactory的处理器(如果有的话)

BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理

注解处理器:可以载入beanDefinitionMap()

SpringBoot中:读取属性处理器:读取property文件到Enviroment中

SpringBoot中:

6.registerBeanPostProcessors(beanFactory);

如果BeanPostProcessors接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调

7.initMessageSource(); 国际化使用

8.initApplicationEventMulticaster();    //初始化上下文 监听广播器

9.onRefresh(); 

//初始化一些特殊的bean

10.registerListeners();

11 finishBeanFactoryInitialization(beanFactory);

//初始化其他的bean

可以查看alreadyCreated 
12 finishRefresh();

转载地址:http://fihgi.baihongyu.com/

你可能感兴趣的文章
linux pmap命令
查看>>
MySQL数据同步【双主热备】
查看>>
Mysql主从复制实践手册
查看>>
nginx配置正向代理支持HTTPS
查看>>
Perf -- Linux下的系统性能调优神器
查看>>
C++ 用libcurl库进行http通讯网络编程
查看>>
秒杀多线程第十篇 生产者消费者问题
查看>>
信号量与互斥锁
查看>>
linux 查看CPU个数,核数
查看>>
string 序列化
查看>>
va_start(),va_end()函数应用
查看>>
crontab命令
查看>>
State Threads——异步回调的线性实现
查看>>
va_start va_end
查看>>
共享内存,共享缓冲区 一对多
查看>>
无锁队列的实现
查看>>
CAS原子操作实现无锁及性能分析
查看>>
Linux 互斥锁、原子操作实现原理
查看>>
搭建简单hls直播测试服务
查看>>
共享内存的数据同步
查看>>