spring源码-bean之增强初始化-3
一、ApplicationContext的中文意思是“应用上下文”,它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为Java EE应用之首选,可应用在Java APP与Java Web中。
二、ApplicationContext相对于XmlBeanFactory做了很多是拓展的功能,而这些拓展的功能,不管是在容器初始化,还是中间需要处理的过程,都做了很大的改善以及深入。
三、先看一下ApplicationContext的继承关系图,了解一下和XmlBeanFactory的区别
注意:这是一张ClassPathXmlApplicationContext的继承关系图,目前是为了更好的呈现,当前bean在加载的时候做的那些事情。
四、可能有人会问,为什么没有DefaultListableBeanFactory的相关属性了呢,这个在源码的讲解部分会细说。
五、源码解析
1)增强性的bean容器初始化实现方式
public static void main(String[] args) { //增强性的bean容器初始化化 ApplicationContext context = new ClassPathXmlApplicationContext("spring-bean.xml"); }
2)实现过程
public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[]{configLocation}, true, (ApplicationContext)null); } public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { super(parent); //设置需要加载的xml文件 this.setConfigLocations(configLocations); if (refresh) { //容器的整个初始化过程都在这里实现 this.refresh(); } }
3)refresh
public void refresh() throws BeansException, IllegalStateException { Object var1 = this.startupShutdownMonitor; synchronized(this.startupShutdownMonitor) { //前期准备工作 this.prepareRefresh(); //xml解析过程 ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory(); //beanFactory的准备过程 this.prepareBeanFactory(beanFactory); try { //BeanFactoryPostProcessor接口拓展 this.postProcessBeanFactory(beanFactory); this.invokeBeanFactoryPostProcessors(beanFactory); //注册BeanPostProcessor的实现接口,实际调用在getBean的时候 this.registerBeanPostProcessors(beanFactory); //国际化 this.initMessageSource(); //初始化应用广播器 this.initApplicationEventMulticaster(); //子类应用 this.onRefresh(); //监听部分 this.registerListeners(); //完成初始化 this.finishBeanFactoryInitialization(beanFactory); //完成刷新 this.finishRefresh(); } catch (BeansException var4) { this.destroyBeans(); this.cancelRefresh(var4); throw var4; } } }
六、因为ApplicationContext在做容器初始化的时候做了很多工作,所以我这里会形成一个目录,来讲解剩下的部分。
2)spring源码-BeanFactoryPostProcessor-3.2(待续)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
十年技术架构,只剩下这套Java技术栈了
蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。 但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜我错过了,我用这五年时间和很多程序员一样在困惑和迷茫中找不到出路! 路其实一直都在那里,只是我们看不到而已! 以前我一直被公司和技术牵着走,并不是自己在选择技术,而是不自觉地被推到了这个位置上。想想有多少人对于自己将来要从事的职业和技术类型进行过深入思考和比较呢?当我跳出编码后,我开始思考和程序及程序员职业生涯相关的问题,最后发现,影响我们走入今天的困局的竟然是一些我们常常挂在嘴边的话。 今天,就为大家整理一份目前互联网公司最主流的技术选型: 阅读源码 程序员每天都和代码打交道。经过数年的基础教育和职业培训,大部分程序员都会「写」代码,或者至少会抄代码和改代码。但是,会读代码的并不在多数,会读代码又真正读懂一些大项目的源码的,少之又少。这也造成了很多错误看源码的方式。 那要如何正确的分析源码呢? 分布式架构 随着我们的业务量越来越大和越重要,单体的架构模式已经无法对应大规模的应用场景,而...
- 下一篇
Java LinkedHashMap类源码解析
LinkedHashMap继承了HashMap,他在HashMap的基础上增加了一个双向链表的结构,链表默认维持key插入的顺序,重复的key值插入不会改变顺序,适用于使用者需要返回一个顺序相同的map对象的情况。还可以生成access-order顺序的版本,按照最近访问顺序来存储,刚被访问的结点处于链表的末尾,适合LRU,put get compute merge都算作一次访问,其中put key值相同的结点也算作一次访问,replace只有在换掉一个键值对的时候才算一次访问,putAll产生的访问顺序取决于原本map的迭代器实现。 在插入键值对时,可以通过对removeEldestEntry重写来实现新键值对插入时自动删除最旧的键值对 拥有HashMap提供的方法,迭代器因为是通过遍历双向链表,所以额外开销与size成正比与capacity无关,因此选择过大的初始大小对于遍历时间的增加没有HashMap严重,后者的遍历时间依赖与capacity。 同样是非线程安全方法,对于LinkedHashMap来说,修改结构的操作除了增加和删除键值对外,还有对于access-order时进行了...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Mario游戏-低调大师作品
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)