Spring基本执行过程解析
来源:互联网 发布:js调用微信分享sdk 编辑:程序博客网 时间:2024/06/01 09:14
一。基本过程
1.当创建一个上下文:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring-config.xml");
2.进入ClassPathXmlApplicationContext.java
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)throws BeansException {super(parent);//2-1setConfigLocations(configLocations);//2-2if (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) {// 1prepareRefresh();// 2ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 3prepareBeanFactory(beanFactory);try {// 4postProcessBeanFactory(beanFactory);// 5invokeBeanFactoryPostProcessors(beanFactory);// 6registerBeanPostProcessors(beanFactory);// 7initMessageSource();// 8initApplicationEventMulticaster();// 9onRefresh();// 10registerListeners();// 11finishBeanFactoryInitialization(beanFactory);// 12finishRefresh();}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();
- Spring基本执行过程解析
- Insight MyBatis-Spring 解析过程,调用执行
- TC执行过程解析
- make执行过程解析
- Spring mvc 执行过程
- Spring Mvc执行过程
- CUDPP基本执行过程分析
- CUDPP基本执行过程分析
- Struts2基本的执行过程
- Spring XML解析过程
- spring xml解析过程
- spring配置解析过程
- spring 解析初始化过程
- Nutch Crawl执行过程解析
- adb命令执行过程解析
- hello world解析执行过程
- 数据库SQL解析执行过程
- sql的执行过程-解析、执行、返回
- XListView使用
- Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
- Java8包装类 新增 无符号运算方法
- Win32多线程编程 — 线程同步与通信
- leetcode:Binary Tree Inorder Traversal 【Java】
- Spring基本执行过程解析
- eclipse发生cannot connect to vm 情况解决办法
- C++智能指针简单剖析
- HDU5635 LCP Array BestCoder
- jquery Mobile 入门3 (表单)
- Android性能优化
- 华为oj 记票统计
- Mechanize模拟自然网页交互一些基本常用方法
- 图像加噪和图像滤波