zoukankan      html  css  js  c++  java
  • spring容器启动过程

    1、AbstractApplicationContext的prepareRefresh()方法调用。

    2、XmlBeanDefinitionReader的loadBeanDifinitions(BeanDefinitionRegistry)方法调用。加载spring配置文件,加载完成之后回调BeanDefinitionRegistry的preInstantiateSingletons()方法,这个方法由DefaultListableBeanFactory类实现。

    3、AbstractApplicationContext的obtainFreshBeanFactory()方法调用。

    4、DefaultListableBeanFactory的preInstantiateSingletons()方法调用。为所有xml文件中定义(以及采用标注方式定义)的bean建立实例。

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    3、注册Bean后处理器:根据反射机制从BeanDefinitionRegistry中找出所有BeanPostProcessor类型的Bean,并将它们注册到容器的BeanPostProcessor的注册表中;

    AbstractApplicationContext中的代码如下:

    protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {

      String[] processorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

      

    }

    4、初始化消息源:初始化容器的国际化信息资源;

    AbstractApplicationContext中的代码如下:

    protected void initMessageSource() {

      //补充

    }

    5、初始化应用上下文事件广播器;(观察者模式中的具体主题角色,持有观察者角色的集合,称为注册表)。

    AbstractApplicationContext拥有一个applicationEventMulticaster成员变量,applicationEventMulticaster提供了容器监听器的注册表,称其为事件广播器。在第七步中将会将事件监听器装入其中。

    AbstractApplicationContext中的代码如下:

    private ApplicationEventMulticaster applicationEventMulticaster;

    protected void initApplicationEventMulticaster() {

      //"applicaitonEventMulticaster",先看配置文件中有无配置该类型。

      if (containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME))  {

        this.applicationEventMulticaster = (ApplicationEventMulticaster) getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);

      } else {

        //若没有,则应用Spring框架提供的事件广播器实例

        this.applicationEventMulticaster = new SimpleApplicationEventMulticaster();

      }

    }

    public boolean containsLocalBean(String name) {

      return getBeanFactory().containsLocalBean(name);

    }

    public Object getBean(String name, Class requiredType) throws BeansException {

      return getBeanFactory().getBean(name, requiredType);

    }

    Spring初始化事件广播器,用户可以在配置文件中为容器定义一个自定义的事件广播器(bean的名称要为"applicaitonEventMulticaster"),只要实现ApplicationEventMulticaster就可以了,Spring在此会根据beanfactory自动获取。如果没有找到外部配置的事件广播器,Spring使用SimpleApplicationEventMulticaster作为事件广播器。

    6、初始化其他特殊Bean:这是一个钩子方法,子类可以借助这个钩子方法执行一些特殊的操作:如AbstractRefreshableWebApplicationContext就使用该钩子方法执行初始化ThemeSource操作;

    protected void onRefresh() throws BeansException {

      

    }

    7、注册事件监听器(观察者模式中的观察者角色)

    Spring根据上下文持有的beanfactory对象(默认是DefaultListableBeanFactory对象),从它的BeanDefinitionRegistry中找出所有实现ApplicationListener的bean,将BeanDefinition对象生成bean,注册为容器的事件监听器,实际的操作就是将其添加到事件广播器所提供的监听器注册表中。

    AbstractApplicationContext中的代码如下:

    private List<ApplicationListener> applicationListeners = new ArrayList<ApplicationListener>();

    public List<ApplicationListener> getApplicationListeners() {

      return this.applicationListeners;

    }

    protected void registerListeners() {

      for (Iterator<ApplicationListener> it=getApplicationListeners().iterator(); it.hasNext();) {

        addListener((ApplicationListener) it.next());

      }

      //获取ApplicationListener类型的所有bean,即事件监听器

      Collection<ApplicationListener> listenerBeans = getBeansOfType(ApplicationListener.class, true, false).values;

      for (Iterator<ApplicationListener> it=listenerBeans.iterator(); it.hasNext();) {

        addListener((ApplicationListener)it.next());

      }

    }

    public Map getBeansOfType(Class type, boolean includePrototypes, boolean allowEageInit) throws BeansException {

      return getBeanFactory().getBeansOfType(type, includePrototypes, allowEagerInit);

    }

    protected void addListener(ApplicationListener listener) {

      getApplicationEventMulticaster().addApplicationListener(listener);

    }

    8、初始化singleton的Bean:实例化所有singleton的Bean,并将它们放入Spring容器的缓存中(DefaultListableBeanFactory,它实现了BeanDefinitionRegistry),这就是和直接在应用中使用BeanFactory的区别之处,在创建ApplicationContext对象时,不仅创建了一个BeanFactory对象,并且还应用它实例化所有单实例的bean。

    AbstractApplicationContext中的代码如下:

    beanFactory.preInstantiateSingletons();

  • 相关阅读:
    set-rebgin
    HTML5开发学习:本地存储Web Sql Database
    Sublime text 入门学习资源篇及其基本使用方法
    web前端不可错过的开发工具–Adobe Brackets
    关于WEB前端开发的工具
    WebStorm使用技巧
    五大浏览器兼容性
    IT解惑真经
    win7下一劳永逸地解决触控板禁用的问题
    PHP+Mysql学习笔记
  • 原文地址:https://www.cnblogs.com/man-li/p/4326580.html
Copyright © 2011-2022 走看看