zoukankan      html  css  js  c++  java
  • Spring容器创建过程

      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 事件派发

  • 相关阅读:
    SSH出现ls command not found
    SVN打包备份
    【转】Linux安装JDK1.7 prm
    任务
    java多线程
    JAVA开发中151个建议
    Linux Too Many OpenFiles
    【收藏】Linux tail命令
    Linux读取属性配置文件注意事项
    [转]Linux端口查看命令
  • 原文地址:https://www.cnblogs.com/toov5/p/10693515.html
Copyright © 2011-2022 走看看