Spring容器的refresh()   创建刷新

1  prepareRefresh() 刷新前的预处理

1) initProPertySources() 初始化一些属性设置; 子类定义个性化的属性设置方法

2) getEnvironment( ) .validateRequiredProperties() 检验属性的合法性

3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器中的一些早期的事件

2 obtainFreshBeanFactory() 获取BeanFactory

1)refreshBeanFactory() 刷新(创建) BeanFactory

创建了一个this.beanFactory =  new DefaultListableBeanFactory()

2) getBeanFactory() 返回刚才GenericApplicationContext 创建的BeanFactory对象

3) 将创建的BeanFactory(DefaultListableBeanFactory)返回

3 prepareBeanFactory(beanFactory); BeanFactory的预准备工作(BeanFactory进行一些设置)

1 设置BeanFactory 的类加载器、支持表达式解析器

2 添加部分BeanPostProcessor[ApplicationContextAwareProcessor]

3 设置忽略的自动装配的接口 EnvironmentAware、 EmbeddedValueResolverAware

4  注册可以解析的自动装配。 直接在任何组件中自动注入: BeanFactory、 ResourceLoader、ApplicationEventPublisher、ApplicationContext

5 添加BeanPostProcessor【ApplicationListenerDetector功能的Processor】

6 添加编译时的AspectJ

7 给BeanFactory中注册有些能用的组件

environment【ConfigurableEnvironmetn】

systemProperties  【Map<String, Object>】

systemEnvironment 【Map<String, Object>】]

4 PostProcessoBeanFactory(BeanFactory) BeanFactory准备工作完成后进行的后置处理工作

1) 子类通过重写这个方法来在BeanFactory创建并又准备完成以后做进一步的设置

到此为止  BeanFactory创建及其预准备工作完成

7  initMessageSource()  初始化MessageSource组件(做国际化功能,消息绑定,消息解析)

1) 获取BeanFactory

2) 看容器是否有id 为messageSource的 类型是MessageSource的组件

如果有赋值给messageSource 如果没有自己创建一个DelegatingMessageSource

MessageSource去除估计会配置文件中的某个key值,能按照区域信息获取

3) 把创建好的MessageSource注册在容器中 以后获取国际化配置文件的值的时候,自动注入MessageSource

8 initApplicationEventMulticaster() 初始化时间派发器

1) 获取BeanFactory

2)  从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster

3) 如果上一步没有配置,创建一个SimpleApplicationEventMulticaster

4) 将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接注入

9  onRerresh() 留给容器(子类)

1)子类重写这个方法,在容器刷新的时候可以自定义逻辑

10   registerListeners() 给容器中将所有项目里面的ApplicationListener注册进来了

1)从容器中拿到所有ApplicationListener

2) 将每个监听器添加到时间派发器中

getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)

3) 派发之前步骤产生的事件

11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例bean

1)获取容器中的所有Bean 一次进行初始和创建对象

2)获取Bdan的定义信息; RootBedanDefinition

3)Bean不是抽象的,是单实例的,懒加载的

1) 判断是否是FactoryBean  是否实现FactoryBean接口的bean

2)不是工厂Bean  利用getBean(beanName) 创建对象

0) getBean(beanName)  IOC.getBean()

1)doGetBean(name, null, null ,false)

2) 先获取缓存中保存的单实例Bean。 如果能够获取到这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)

3)缓存中获取不到,开始Bean的创建对象流程

4)标记当前bean已经被创建

5) 获取Bean的定义信息

6)  获取当前Bean依赖的其他Bean,如果有按照getBean() 把依赖的Bean先创建出来
                   7) 启动单实例Bean的创建流程

1) createBean(beanName, mbd , args)

2)  Object bean =resolveBeforeINstantiation(beanName, mbdToUse)

简单总结:

1 Spring容器在启动时候,贤惠保存素有注册进来的Bean的定义信息

xml   注解  给容器注册bean定义信息

2  spring容器会在何时时机创建这些bean

用到这个bean 的时候; 利用getBean创建Bean;创建好以后保存在容器中

统一创建剩下所有的bean的时候; finishBeanFactoryInitialization()

3 后置处理器

1 每一个bean创建完成都会使用各种后置处理器进行处理,来增强bean的功能

处理自动注入   aop功能等 以及支持异步调用的 任务调度的 增强功能注解都是有响应的后置处理器

4 时间驱动模型

ApplicationListener 事件监听

ApplicationEventMulticaster 事件派发

Spring容器创建过程的更多相关文章

  1. Spring源码解析 – AnnotationConfigApplicationContext容器创建过程

    Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationC ...

  2. SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程

    在上一篇<Spring--Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)>中说到了Web应用中的IoC容器创建过程.这一篇主要讲Sprin ...

  3. SpringIOC容器创建过程

    在测试时,经常使用这种方式来创建spring容器 //创建基于注解的springIOC容器 ApplicationContext applicationContext = new Annotation ...

  4. 51、[源码]-Spring容器创建-容器创建完成

    51.[源码]-Spring容器创建-容器创建完成 12.finishRefresh();完成BeanFactory的初始化创建工作:IOC容器就创建完成: 1).initLifecycleProce ...

  5. 50、[源码]-Spring容器创建-Bean创建完成

    50.[源码]-Spring容器创建-Bean创建完成 11.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean: beanFac ...

  6. 49、[源码]-Spring容器创建-创建Bean准备

    49.[源码]-Spring容器创建-创建Bean准备

  7. 48、[源码]-Spring容器创建-初始化事件派发器、监听器等

    48.[源码]-Spring容器创建-初始化事件派发器.监听器等 8.initApplicationEventMulticaster();初始化事件派发器: 获取BeanFactory 从BeanFa ...

  8. 47、[源码]-Spring容器创建-初始化MessageSource

    47.[源码]-Spring容器创建-初始化MessageSource 7.initMessageSource();初始化MessageSource组件(做国际化功能:消息绑定,消息解析): 获取Be ...

  9. 46、[源码]-Spring容器创建-注册BeanPostProcessors

    46.[源码]-Spring容器创建-注册BeanPostProcessors 6.registerBeanPostProcessors(beanFactory);注册BeanPostProcesso ...

随机推荐

  1. jquery动态生成html代码绑定事件

    今天工作中需要在页面动态生成html代码,但发现新生成的代码的click事件失效了(非动态生成的代码已经绑定了click事件),于是在网上找了很多解决办法,很多都比较复杂,且使用的jquery都比较老 ...

  2. [LintCode] 全排列

    递归实现: class Solution { public: /** * @param nums: A list of integers. * @return: A list of permutati ...

  3. k8s更新Pod镜像

    实际使用k8s中,如果使用RC启动pod可以直接使用滚动更新进行pod版本的升级,但是我们使用的情况是在pod里面启动有状态的mysql服务,没有和RC进行关联,这样更新的时候只能通过 更新pod的配 ...

  4. Spoken English Practice( Believe it or not, I don't need to make believe its a big deal. (believe,deal, You don't say))

    音标复习                                                绿色:连读:红色:略读:蓝色:浊化:橙色:弱读 口语蜕变(2017/6/25) Sorry, t ...

  5. Storm的组件

    摘自网上 当时写的很好,很详细的介绍了各个组件直接的关系 Storm集群和Hadoop集群表面上看很类似.但是Hadoop上运行的是MapReduce jobs,而在Storm上运行的是拓扑(topo ...

  6. python系列十六:Python3 面向对象

    #!/usr/bin/python #-*-coding:gbk-*- #Python3 面向对象 '''面向对象技术简介    类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了 ...

  7. Java 之图形验证码

    图形验证码作用 防止恶意注册 防暴力破解 Java 与图片相关的类: Image, ImageIO, BufferedImage, Icon, ImageIcon public static void ...

  8. eclipse欺骗了我

    Java源文件(.java)和Java的字节码文件(.class)跟 package 是个什么关系? 平时使用 eclipse 的时候,发现 .java 文件目录必须和 package 包名保持一致, ...

  9. Objective-C学习笔记(五)——数据类型与限定词

    如同其它不论什么的编程语言一样,想要更深入的学习.必需要了解该门语言的数据类型与限定词. OC的数据类型例如以下: (1)int:整型:   int a;      int b=2;     int ...

  10. TI C66x DSP 系统events及其应用 - 5.7(IST)

    当CPU開始处理一个中断(INT4~15)时,它将引用中断服务表(IST).IST是一个获取包括中断服务代码的包的表. IST包括16个连续的获取包.每个中断服务获取包(ISFP)包括最多14条指令( ...