美文网首页
spring bean的初始化过程

spring bean的初始化过程

作者: wei_lu_lu | 来源:发表于2019-01-17 19:14 被阅读0次

在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory类的方法initializeBean里进行了bean的初始化操作(spring使用4.3.23版本)

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
        if (System.getSecurityManager() != null) {
            AccessController.doPrivileged(new PrivilegedAction<Object>() {
                @Override
                public Object run() {
                    invokeAwareMethods(beanName, bean);
                    return null;
                }
            }, getAccessControlContext());
        }
        else {
            invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
        }

        try {
            invokeInitMethods(beanName, wrappedBean, mbd);
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    (mbd != null ? mbd.getResourceDescription() : null),
                    beanName, "Invocation of init method failed", ex);
        }
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }
        return wrappedBean;
    }

    private void invokeAwareMethods(final String beanName, final Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware) bean).setBeanName(beanName);
            }
            if (bean instanceof BeanClassLoaderAware) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
            }
            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
            }
        }
    }

对应的文字描述:
1)设置属性值;

2)调用Bean中的BeanNameAware.setBeanName()方法,如果该Bean实现了BeanNameAware接口;

3)调用Bean中的BeanFactoryAware.setBeanFactory()方法,如果该Bean实现了BeanFactoryAware接口;

4)调用BeanPostProcessors.postProcessBeforeInitialization()方法;

5)调用Bean中的afterPropertiesSet方法,如果该Bean实现了InitializingBean接口;

6)调用Bean中的init-method,通常是在配置bean的时候指定了init-method,例如:<bean class="beanClass" init-method="init"></bean>

7)调用BeanPostProcessors.postProcessAfterInitialization()方法;

8)如果该Bean是单例的,则当容器销毁并且该Bean实现了DisposableBean接口的时候,调用destory方法;如果该Bean是prototype,则将准备好的Bean提交给调用者,后续不再管理该Bean的生命周期。

对应的图片:


spring bean生命周期.png

相关文章

  • Spring 初始化 ContextLoaderListener

    0. 概述 分析web项目中spring的配置,初始化,bean解析和注入的过程,以及spring bean 的生...

  • Spring源码学习③-生命周期

    Bean生命周期: Bean创建=》初始化=》销毁的过程,我们称之为Bean的生命周期。 Spring里面...

  • spring bean

    Spring IOC 容器源码分析 Bean初始化过程 ConversionService ConversionS...

  • Spring bean的生命周期

    Spring bean的生命周期 生命周期 bean从创建 -> 初始化 -> 销毁的过程 默认情况下 bean的...

  • Spring Bean生命周期

    Spring Bean的生命周期从Spring容器的初始化到Bean的销毁,期间经历的过程如下 容器注入了上面提到...

  • Spring Bean注册解析(一)

    Spring是通过IoC容器对Bean进行管理的,而Bean的初始化主要分为两个过程:Bean的注册和Bean实例...

  • Spring中IOC容器的初始化过程

    Spring IOC容器初始化过程分为Resource定位,载入解析,注册。IOC容器初始化过程中不包含Bean的...

  • Spring 的 bean 初始化过程

    Spring 的 bean 初始化过程 前言 Spring 框架最基础来说, 是一个 DI(依赖注入) 框架. 我...

  • 面试问题记录(08.12)

    Spring:IOC的理解以及IOC容器的初始化过程,Spring的Bean保持在哪里,BeanFactory与F...

  • 4、spring初始化过程

    spring初始化过程也叫ioc容器初始化过程、bean生命周期。 1、从main函数开始 2、进入new Cla...

网友评论

      本文标题:spring bean的初始化过程

      本文链接:https://www.haomeiwen.com/subject/jthwdqtx.html