spice and wolfspice and wolf Be the One you wanna Be

Bean的生命周期

从Run方法开始定位bean生命周期的实现方法

从run方法开始,逐步解析定位到bean生命周期逻辑:

首先这是我们的主启动类入口:

        SpringApplicationRunListeners listeners = this.getRunListeners(args);
        listeners.starting();

这里主要用于启动spring的事件监听器,用于监听容器各个生命周期的各个事件

context = this.createApplicationContext();

创建spring容器类

this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);

加载各种BeanDefinitionLoader,BeanDefinitionLoader中包括AnnotatedBeanDefinitionReader、XmlBeanDefinitionReader、ClassPathBeanDefinitionScanner、BeanDefinitionReader等基于通过不同方式引入bean的读取器

然后prepareContext方法基本就走完了,后面会执行refreshContext方法

this.refreshContext(context);

我们直接往里定位到最里层的refresh()方法,它的三个实现类都会走AbstractApplicationContext中同步代码块的逻辑,这里面就包括了bean的生命周期

在bean的生命周期之前,有几步准备工作:

  1. 监听器
  2. 创建beanFactory
  3. 初始化beanFacotry

其中在创建beanFacotry时会将加载beanDefinition为后面bean的生命周期做准备:

ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();

继续在refreshBeanFactory中定位beanDefinitions的处理逻辑:

loadBeanDefinitions()函数会基于对应的reader加载所有的beanDefinition,这里我们看loadBeanDefinitions的其中一个实现类AbstractXmlApplicationContext中的loadBeanDefinitions

向继续看更深的实现逻辑

这里看PropertiesBeanDefinitionReader的loadBeanDefinitions(Resource resource)的方法实现

继续往下,主要看看BeanDefinition的生成逻辑,这里props是一个bean name与类全限定名的map

最后定位到registerBeanDefinition方法

看到createBeanDefinition方法的处理逻辑

如果classLoader不为空,会给beanDefinition的BeanClass赋值对应的class,其实就是拿到beanDefinition的Class;如果为空则给BeanClassName赋值

而这里注册器的作用就是存放一个map,用于存放beanDefinition的map

看其中一个实现类的代码

registerBeanDefinition本身也只是在map中存储一个BeanName-BeanDefinition的键值对

beanDefinition处理完成后,就进入bean生命周期逻辑中了

然后继续向下定位bean的生命周期代码逻辑:

doGetBean中会调用createBean方法

createBean中又会调用doCreateBean,doCreateBean方法中包含了bean生命周期的几乎所有阶段

bean生命周期解析

前言

首先spring容器在获取bean时会调用getBean(beanName)方法(或同名重载方法),getBean()所有重载都是基于doGetBean()方法实现的。

    // AbstractBeanFactory.class
    
    protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
        String beanName = this.transformedBeanName(name);
        Object sharedInstance = this.getSingleton(beanName);
        Object bean;
        if (sharedInstance != null && args == null) {
            ...
            bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
        } else {
            ...

            try {
                RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
                ...

                // 判断是否是单例
                if (mbd.isSingleton()) {
                    // 获取单例
                    sharedInstance = this.getSingleton(beanName, () -> {
                        try {
                            return this.createBean(beanName, mbd, args);
                        } catch (BeansException var5) {
                            this.destroySingleton(beanName);
                            throw var5;
                        }
                    });
                    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
                } else if (mbd.isPrototype()) {
                    ...
                } else {
                    ...
                }
            } catch (BeansException var26) {
                this.cleanupAfterBeanCreationFailure(beanName);
                throw var26;
            }
        }

        if (requiredType != null && !requiredType.isInstance(bean)) {
            ...
        } else {
            return bean;
        }
    }

在这个方法中会根据三级缓存机制拿到缓存的bean,如果都没有则会执行bean的创建流程,即执行createBean()方法,createBean()的核心逻辑都在doCreateBean()方法中,所以我们想要了解bean的生命周期需要集中学习这个代码的执行逻辑。

    // AbstractAutowireCapableBeanFactory.class

    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
        BeanWrapper instanceWrapper = null;
        if (mbd.isSingleton()) {
            instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
        }

        // 实例化
        if (instanceWrapper == null) {
            instanceWrapper = this.createBeanInstance(beanName, mbd, args);
        }

        Object bean = instanceWrapper.getWrappedInstance();
        ...

        // 判断是否是正在创建的单例Bean
        boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
        if (earlySingletonExposure) {
            ...

            // 添加到三级缓存
            this.addSingletonFactory(beanName, () -> {
                return this.getEarlyBeanReference(beanName, mbd, bean);
            });
        }

        Object exposedObject = bean;

        try {
            // 属性赋值
            this.populateBean(beanName, mbd, instanceWrapper);
            // 初始化
            exposedObject = this.initializeBean(beanName, exposedObject, mbd);
        } catch (Throwable var18) {
            if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
                throw (BeanCreationException)var18;
            }

            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
        }

        ...
    }

bean的生命周期中的前三个阶段在doCreateBean()中都能定位到对应的方法:

  • 实例化(this.createBeanInstance(beanName, mbd, args))
  • 属性赋值(this.populateBean(beanName, mbd, instanceWrapper))
  • 初始化(this.initializeBean(beanName, exposedObject, mbd))

实例化

传入的参数有三个,第一个beanName没什么好说的,第二个是beanDefinition,第三个是其他参数,这里我们往回追一下beanDefinition是从哪里取的

这里首先会从AbstractBeanFactory类的mergedBeanDefinitons这个map中取

如果去不到则会返回this.getMergedBeanDefinition(beanName, this.getBeanDefinition(beanName))的返回值,其中this.getBeanDefinition(beanName)获取到的beanDefinition对象其实是从beanDefinitionMap中取的,这就跟之前beanDefinition的创建和注册对上了

当前类也的确是BeanDefinitionRegistry的实现类之一

然后getMergedBeanDefinition方法实现中返回的方法实例也是基于getBeanDefinition返回对象进行重载的

属性赋值

属性赋值的参数有三:beanName、beanDefinition和instanceWrapper(刚创建的bean实例对象)

初始化

    // AbstractAutowireCapableBeanFactory.class

    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
        if (System.getSecurityManager() != null) {
            AccessController.doPrivileged(() -> {
                this.invokeAwareMethods(beanName, bean);
                return null;
            }, this.getAccessControlContext());
        } else {
            this.invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        // 初始化前扩展
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        // 初始化
        try {
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }

        // 初始化后扩展
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }

这里有四个扩展点:

  • xxxAware。
  • 初始化前。this.applyBeanPostProcessorsBeforeInitialization(bean, beanName)。
  • 初始化。afterPropertiesSet()。
  • 初始化后。this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)。会执行AOP动态代理操作并返回动态代理对象。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Press ESC to close