spring framework 4 源码阅读
前面写了几篇spring 的介绍文章,感觉与主题不是很切合。重新整理下思路,从更容易理解的角度来写下文章。
spring 的骨架
导演负责安排演出,演员负责按照导演的指示来演出,演出过程中需要使用道具。
我想大家看完这些图片之后就明白大致的包关系了。
spring包结构
核心类之间的关系
BeanFactory【所有BeanFactory的父类】
HierarchicalBeanFactory【层次化的BeanFactory】
LisableBeanFactory列表式Beanfactory
小结:
context【上下线文】
registry【实例或者bean描述注册器】
Strategy【初始化策略】
context的初始化
- /**
- * 在parent下创建ClassPathXmlApplicaitonContext,
- * 从XML中读取所有Bean定义.
- * @param configLocations 配置文件路径如c:\simpleContext.xml
- * @param refresh 是否需要自动刷新context,refresh-->重新加载
- * 加载所有的bean定义,创建所有单例.
- * refresh为true的时候, 根据context来手工刷新
- * @param parent the parent context
- * @throws BeansException if context creation failed
- * @see #refresh()
- */
- public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
- throws BeansException {
- //初始化XmlApplicationContext
- super(parent);
- //转换配置文件的路径
- setConfigLocations(configLocations);
- if (refresh) {
- //重新刷新原有的context,这一篇的重点
- refresh();
- }
- }
下面我们来看下AbstractApplicationContext.refresh()方法
- //加载或刷新持久的配置,可能是xml文件,properties文件,或者关系型数据库的概要。
- //做为一个启动方法,如果初始化失败将会销毁已经创建好的单例,避免重复加载配置文件。
- //换句话说,在执行这个方法之后,要不全部加载单例,要不都不加载
- public void refresh() throws BeansException, IllegalStateException
- {
- synchronized (this.startupShutdownMonitor)
- {
- // 初始化配置准备刷新,验证环境变量中的一些必选参数
- prepareRefresh();
- // 告诉继承类销毁内部的factory创建新的factory的实例
- // 初始化Bean实例
- ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
- // 初始化beanFactroy的基本信息,包括classloader,environment,忽略的注解等
- prepareBeanFactory(beanFactory);
- try {
- // beanfactory内部的postProcess,可以理解为context中PostProcess的补充
- beanFactory.postProcessBeanFactory(beanFactory);
- // 执行BeanFactoryPostProcessor(在beanFactory初始化过程中,bean初始化之前,修改beanfactory参数)、
- // BeanDefinitionRegistryPostProcessor 其实也是继承自BeanFactoryPostProcessor,
- // 多了对BeanDefinitionRegistry的支持invokeBeanFactoryPostProcessors(beanFactory);
- // 执行postProcess,那BeanPostProcessor是什么呢,是为了在bean加载过程中修改bean的内容,
- // 使用分的有两个而方法Before、After分别对应初始化前和初始化后
- registerBeanPostProcessors(beanFactory);
- // 初始化MessageSource,主要用作I18N本地化的内容
- initMessageSource();
- // 初始化事件广播ApplicationEventMulticaster,使用观察者模式,对注册的ApplicationEvent时间进行捕捉
- initApplicationEventMulticaster();
- // 初始化特殊bean的方法
- onRefresh();
- // 将所有ApplicationEventListener注册到ApplicationEventMulticaster中
- registerListeners();
- // 初始化所有不为lazy-init的bean,singleton实例
- finishBeanFactoryInitialization(beanFactory);
- // 初始化lifecycle的bean并启动(例如quartz的定时器等),如果开启JMX则将ApplicationContext注册到上面
- finishRefresh();
- }
- catch (BeansException ex)
- {
- //销毁已经创建单例
- resources.destroyBeans();
- // 将context的状态转换为无效,标示初始化失败
- flag.cancelRefresh(ex);
- // 将异常传播到调用者
- throw ex;
- }
- }
- }
spring framework 4 源码阅读的更多相关文章
- spring framework 4 源码阅读(1) --- 前期准备
在开始看代码之前,需要做的第一件事是下载代码. 在这里:https://github.com/spring-projects/spring-framework 下载完成了发现使用gradle做的源代码 ...
- spring framework 4 源码阅读(2)---从ClassPathXmlApplicationContext开始
Application初始化日志 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperti ...
- Spring 注册BeanPostProcessor 源码阅读
回顾上一篇博客中,在AbstractApplicationContext这个抽象类中,Spring使用invokeBeanFactoryPostProcessors(beanFactory);执行Be ...
- spring framework项目源码github托管地址
方法一:直接下载,github托管地址:http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 方法二: ...
- (转) Spring源码阅读 之 Spring整体架构
标签(空格分隔): Spring 声明:本文系转载,原地地址:spring framework 4 源码阅读 Spring骨架 Spring的骨架,也是Spring的核心包.主要包含三个内容 cont ...
- Spring源码阅读笔记
前言 作为一个Java开发者,工作了几年后,越发觉力有点不从心了,技术的世界实在是太过于辽阔了,接触的东西越多,越感到前所未有的恐慌. 每天捣鼓这个捣鼓那个,结果回过头来,才发现这个也不通,那个也不精 ...
- Spring源码阅读系列总结
最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...
- Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
我们到底能走多远系列(33) 扯淡: 各位: 命运就算颠沛流离 命运就算曲折离奇 命运就算恐吓着你做人没趣味 别流泪 心酸 更不应舍弃 ... 主题: Spring源码阅读还在继 ...
- 初始化IoC容器(Spring源码阅读)
初始化IoC容器(Spring源码阅读) 我们到底能走多远系列(31) 扯淡: 有个问题一直想问:各位你们的工资剩下来会怎么处理?已婚的,我知道工资永远都是不够的.未婚的你们,你们是怎么分配工资的? ...
随机推荐
- Linux 调度器模拟
http://www.ibm.com/developerworks/cn/linux/l-linux-scheduler-simulator/ LinSched LinSched 是驻留在用户空间中的 ...
- qt 关于内存泄漏的检测
Qt 关于内存泄露的检测: 收藏人:guitarhua 2012-02-10 | 阅: 转: | 来源 | 分享 Qt 关于内存泄露的检测:工具篇 ...
- Quartz contention when running in load balanced environment--reference
1.8.3 appears to have addressed this issue with a single application server. However, we're seeing t ...
- Entity Framework CodeFirst------数据迁移(二)
众所周知当我们的项目涉及到数据库时,随着需求或大或小的 变更后,我们之前设计好的数据模型会发生部分的更改,导致数据表.或者数据字段的增加.修改等,这个时候我们就需要对数据库结构进行修改,如果我们之前采 ...
- iOS 10 个实用小技巧(总有你不知道的和你会用到的)
在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有 ...
- Python开发【第九篇】:HTML (二)
python[第十四篇]HTML基础 时间:2016-08-08 20:57:27 阅读:49 评论:0 收藏:0 [点我收藏+] 标签: 什么是HTML? H ...
- noip 2012 疫情控制
/* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...
- Break和Continue的一些注意事项
Break: 1)可以用于switch-case判断中,用于跳出switch 2)用在循环中,用于立即跳出循环 其中,用于循环的情况下,跳出的是break所在的循环 Continue: 立即结束本次循 ...
- 获取html页面所有的img标签
#region 获取html中所有Img Regex r = new Regex(@"<img[\s\S]*?>", RegexOptions.IgnoreCase); ...
- Message,MessageQueue,Looper,Handler ——由view.post(runnable想到的)
近日看到代码有view.post(runable),发现对handler机制又有些模糊,故做些复习. 这里就不再对具体的源码原理做深入复习了,就抄一些基本的结论吧. 1.基本概念 Message:基本 ...