Spring Bean初始化过程

一、首先我们来看ClassPathXmlApplicationContext类体系结构

 

从该继承体系可以看出:

1.       BeanFactory 是一个 bean 工厂的最基本定义,里面包含了一个 bean 工厂的几个最基本的方 法,getBean(…) 、 containsBean(…) 等 ,是一个很纯粹的bean工厂,不关注资源、资源位置、事件等。 ApplicationContext 是一个容器的最基本接口定义,它继承了 BeanFactory, 拥有工厂的基本方法。同时继承了 ApplicationEventPublisher 、 MessageSource 、 ResourcePatternResolver 等接口, 使其 定义了一些额外的功能,如资源、事件等这些额外的功能。

2.      AbstractBeanFactory 和 AbstractAutowireCapableBeanFactory 是两个模 板抽象工厂类。AbstractBeanFactory 提供了 bean 工厂的抽象基类,同时提供 了 ConfigurableBeanFactory 的完整实现。AbstractAutowireCapableBeanFactory 是继承 了 AbstractBeanFactory 的抽象工厂,里面提供了 bean 创建的支持,包括 bean 的创建、依赖注入、检查等等功能,是一个 核心的 bean 工厂基类。

3.       ClassPathXmlApplicationContext之 所以拥有 bean 工厂的功能是通过持有一个真正的 bean 工厂DefaultListableBeanFactory 的实例,并通过 代理 该工厂完成。

4.       ClassPathXmlApplicationContext 的初始化过程是对本身容器的初始化同时也是对其持有的DefaultListableBeanFactory 的初始化。

二、容器的初始化过程

我们知道在spring中BeanDefinition很重要。因为Bean的创建是基于它的。容器AbstractApplicationContext中有个方法是refresh()这个里面包含了整个Bean的初始化流程实现过程,如果我们需要自己写一个ClassPathXmlApplicationContext类的话我们可以继承这个类,下面贴段这个方法的代码:

 

public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.
            prepareRefresh();// Tell the subclass to refresh the internal bean factory.ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);// Initialize message source for this context.
                initMessageSource();// Initialize event multicaster for this context.
                initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.
                onRefresh();// Check for listener beans and register them.
                registerListeners();// Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.
                finishRefresh();}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.
                beanFactory.destroySingletons();// Reset 'active' flag.
                cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}

 

 

 如上代码加上图片就是整个Bean的初始化过程。我们知道Bean有可以配置单列以及懒加载形式。在初始化的过程中,我们也能很好的观察到这个过程的实现。

在AbstractBeanFactory中定义了getBean()方法,而它又调用doGetBean().

 

GetBean 的大概过程:

1.       先试着从单例缓存对象里获取。

2.       从父容器里取定义,有则由父容器创建。

3.       如果是单例,则走单例对象的创建过程:在 spring 容器里单例对象和非单例对象的创建过程是一样的。都会调用父 类 AbstractAutowireCapableBeanFactory 的 createBean 方法。 不同的是单例对象只创建一次并且需要缓 存起来。 DefaultListableBeanFactory 的父类 DefaultSingletonBeanRegistry 提供了对单例对 象缓存等支持工作。所以是单例对象的话会调用 DefaultSingletonBeanRegistry 的 getSingleton 方法,它会间 接调用AbstractAutowireCapableBeanFactory 的 createBean 方法。

如果是 Prototype 多例则直接调用父类 AbstractAutowireCapableBeanFactory 的 createBean 方法。

转载于:https://www.cnblogs.com/fyx158497308/p/3977391.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顶宽的div中的英文不能自动换行

1.在一个设定好宽度的div中,当我们输入的中文文字长度超过了设定宽度时,会自动换到下一行。但是,如果输入的是英文字母,那么,无论你div设定宽度为多少,英文字母都是不换行直接在同一行输出,导致…

读取CPU信息

简单的讲下读取CPU信息的一个思路,看了后,相信谁都会说:原来这么简单呀,我也会。哈哈,进入正题,看图: 看清楚了吗,原来CPU信息在注册表里就有。如果你只是要简单的CPU信息&#xff0…

samba3.2的安装全过程(tar方式)

samba服务器,我相信大家都不陌生,主要用来实现windows和linux之间的资源共享,网上比较多的是采用rpm安装包的方式安装,我个人也觉得rpm方式安装比较方便容易,如果没什么特别需求,还是用这种吧!我这里介绍的是采用tar方式的安装.首先下载一个samba的安装文件:samba-3.2.0.tar.gz…

CSS之media Query

CSS3中的Media Queries增加了更多的媒体查询,同时你可以添加不同的媒体类型的表达式用来检查媒体是否符合某些条件,如果媒体符合相应的条件,那么就会调用对应的样式表。换句简单的说,“在CSS3中我们可以设置不同类型的媒体条件&am…

VC6编译卡死之解决办法

From: http://www.hackpig.cn/post/601.html 一直以来用的VC6都是随便下载了一下VC6SP6,据介绍说是集成了sp6的,结果多次在编译的时候被卡死,不能关闭,只能从任务管理器直接结束,感觉很麻烦,简直就是影响人…

Visual Studio 2010 中的 SharePoint 开发

Chai同学已经在他的blog上贴了文章,讲述VS2010中,针对SharePoint开发的一些增强。虽说VS2010还有一点点远,但是先了解一下也是不错的。嗯,在VS2008上,应该至少还会发布一个VSeWSS 1.4出来。 新的项目模板类型&#xf…

CSS之media query模板

在Responsiv的设计中,CSS3的Media是起着非常关键性的作用,也可以说没有CSS3 Media这个属性,Responsiv设计是玩不起来,也是玩不转的。大家都知道Responsiv是为各种不同的设备进行样式设计的,但有一个问题大家或许还处在…

自定义ActiveX组件在设计阶段,切换属性页后出现异常

源码下载&#xff1a;ActiveX-Clock-OCX 参照孙鑫的<<VC深入详解>>中第18章自定义ActiveX中的Clock例子(到18.3节之前)&#xff0c;完成了OCX控件的制作&#xff0c;而且也编译(Debug模式)、注册成功了&#xff01;于是又创建了一个MFC基于对话框的测试程序&#x…

C#正则表达式整理备忘

转载于&#xff1a;http://www.cnblogs.com/KissKnife/archive/2008/03/23/1118423.html有一段时间&#xff0c;正则表达式学习很火热很潮流&#xff0c;当时在CSDN一天就能看到好几个正则表达式的帖子&#xff0c;那段时间借助论坛以及Wrox Press出版的《C#字符串和正则表达式…

vue.js 引用背景图 background 无效的3种解决办法

&#xff03;vue.js项目中&#xff0c;出现css调用background背景图无效&#xff1f;如何解决&#xff1f; 或者调用<img>标签&#xff0c;也无效果&#xff1f; 直接上代码&#xff0c;自行对比查找一下&#xff1a; 效果图预览 1. 正确的代码&#xff0c;示例如下&…

CSS之Responsive网页设计的三个特性

Responsive网页设计无疑是网页设计中的一个热门话题。某种程度上&#xff0c;他将是一个最受欢迎的网页设计概念&#xff0c;因为随着网站用户日渐多样化的访问方法&#xff0c;比如说“iPad”、“iPhone”、“Android移动设备”、“平板电脑”、“台式机”以及“ 笔记本”等不…

什么是awk?

你可能对UNIX比较熟悉&#xff0c;但你可能对awk很陌生&#xff0c;这一点也不奇怪&#xff0c;的确&#xff0c;与其优秀的功能相比&#xff0c;awk还远没达到它应有的知名度。awk是什么&#xff1f;与其它大多数UNIX命令不同的是&#xff0c;从名字上看&#xff0c;我们不可能…

CSS之不使用Media Queries的自适应CSS

虽然标题说不用Media Queries&#xff0c;但我还是要在开头讲清楚&#xff0c;本文并不是要大家丢掉Media Queries&#xff0c;也不是要抨击Media Queries。Media Queries实际上非常有用&#xff0c;我在各种地方都会用到。但Media Queries并不能解决所有的自适应的设计问题 本…

Taro+react开发(32) Please use the ‘new‘ operator, this DOM object constructor cannot be called as a fu

2.Failed to construct Image: Please use the new operator, this DOM object constructor cannot be called as a function 像上面这种错误都是使用了元素&#xff0c;但没有import到文件导致。

0920

今天的亚洲区网络赛我们学校第一次把工大和工程干掉了 有一种慕名奇妙的自豪感 转载于:https://www.cnblogs.com/zhanzhao/p/3983866.html

Linux下的文件系统与目录系统简介

Linux下的文件系统与目录系统简介一. 文件系统 LINUX有四种基本文件系统类型&#xff1a;普通文件、目录文件、连接文件和特殊文件&#xff0c;可用file命令来识别。 普通文件&#xff1a;如文本文件、C语言元代码、SHELL脚本、二进制的可执行文件等&#xff0c;可用cat、less、…