spring源码分析-spring上下文的初始化

下面是上下文初始化的核心方法

public void refresh() throws BeansException, IllegalStateException {
    Object var1 = this.startupShutdownMonitor;
    synchronized(this.startupShutdownMonitor) {
        // 准备工作
        this.prepareRefresh();
        // 获取beanFactory,此方法会读取解析application.xml,得到Bean的定义,注册到beanFactory
        ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
        // 配置beanFactory
        this.prepareBeanFactory(beanFactory);

        try {
            //提供扩展,配置beanFactory
            this.postProcessBeanFactory(beanFactory);
            //执行beanFactoryPostProcessors
            this.invokeBeanFactoryPostProcessors(beanFactory);
            //注册beanPostProcessors
            this.registerBeanPostProcessors(beanFactory);
            this.initMessageSource();
            this.initApplicationEventMulticaster();
            this.onRefresh();
            this.registerListeners();
            //bean的实例化和初始化
            this.finishBeanFactoryInitialization(beanFactory);
            this.finishRefresh();
        } catch (BeansException var5) {
            this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt", var5);
            this.destroyBeans();
            this.cancelRefresh(var5);
            throw var5;
        }

    }
}

spring配置解析:

https://www.cnblogs.com/leftthen/p/5615066.html

我们来详细说明一下核心方法

invokeBeanFactoryPostProcessors

从beanDefinitionNames得到实现了BeanFactoryPostProcessor的类,实例化之后执行其核心方法,

这个操作发生在业务bean的实例化之前,这是一个容器级别的processor,主要是为了在bean实例化之前进行一些处理,目前项目中有两处有两处用到,一个是替换配置文件中的变量,我们在spring的配置文件中配置一个bean,实现BeanFactoryPostProcessor,从zk上读取一些值。另一个是配置了一个扫描mapper的bean,这个也实现了BeanFactoryPostProcessor,负责将mapper托管给bean工厂

registerBeanPostProcessors

从beanDefinitionNames得到实现了BeanPostProcessor的类,实例化之后注册到beanFactory,关于beanPostProcessor的作用不做赘述(网上的资料已经把这个讲烂了)

finishBeanFactoryInitialization

这个方法的核心是对bean的实例化

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
    if(this.logger.isDebugEnabled()) {
        this.logger.debug("Creating instance of bean \'" + beanName + "\'");
    }

    this.resolveBeanClass(mbd, beanName, new Class[0]);

    try {
        mbd.prepareMethodOverrides();
    } catch (BeanDefinitionValidationException var5) {
        throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", var5);
    }

    Object beanInstance;
    try {
        beanInstance = this.resolveBeforeInstantiation(beanName, mbd);
        if(beanInstance != null) {
            return beanInstance;
        }
    } catch (Throwable var6) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var6);
    }

    beanInstance = this.doCreateBean(beanName, mbd, args);
    if(this.logger.isDebugEnabled()) {
        this.logger.debug("Finished creating instance of bean \'" + beanName + "\'");
    }

    return beanInstance;
}

resolveBeforeInstantiation:这步操作会判断是否需要执行 InstantiationAwareBeanPostProcessor,这是一种非常特殊的BeanPostProcessor,通常的BeanPostProcessor都是发生在bean实例化之后,对bean的初始化进行前后干预,而这个InstantiationAwareBeanPostProcessor是对bean的实例化前后干预

doCreateBean:创建bean的实例,然后初始化bean,初始化bean前后执行对应的postProcessor

下图描述了bean的实例化和初始化过程

《spring源码分析-spring上下文的初始化》

依赖注入:

实例化后

this.populateBean(beanName, mbd, instanceWrapper);
使用AutowiredAnnotationBeanPostProcessor进行依赖注入,具体是里面的
AutowiredFieldElement中的inject方法

    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/xh86852909/article/details/78181417
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞