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();

  • 相关阅读:
    zbb20181207 springboot @ConfigurationProperties使用
    zbb20181206 logback,lombok 默认日志logback配置解析
    Spring Boot (8) 全局异常处理
    Spring Boot (7) JdbcTemplate访问数据库
    Spring Boot (6) Spring Data JPA
    Spring Boot (4) 静态页面和Thymeleaf模板
    Spring Boot (3) 热部署devtools
    Spring Boot (2) Restful风格接口
    Spring Boot (1) 构建第一个Spring Boot工程
    idea使用maven搭建ssm框架实现登陆商品增删改查
  • 原文地址:https://www.cnblogs.com/man-li/p/4326580.html
Copyright © 2011-2022 走看看