Spring bean的生命周期

spring bean的生命周期

在Spring bean生命周期中用到的两个重要的后置处理器BeanPostProcessorInstantiationAwareBeanPostProcessor。InstantiationAwareBeanPostProcessor接口继承了BeanPostProcessor接口。

public interface BeanPostProcessor {
	//在实例化和属性注入之后,初始化之前调用
	Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
	//在初始化之后调用
	Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

}



public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
    
    @Nullable
    default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        return null;
    }

    default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        return true;
    }

    @Nullable
    default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
            throws BeansException {
        return null;
    }

    @Deprecated
    @Nullable
    default PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds,
             Object bean, String beanName) throws BeansException {
        return pvs;
    }

}

1postProcessBeforeInstantiation调用时机为bean实例化(Instantiation)之前,如果返回了bean实例, 则会替代原来正常通过target bean生成的bean的流程。典型的例如aop返回proxy对象,此时bean的执行流程将会缩短, 只会执行BeanPostProcessor接口的postProcessAfterInitialization方法完成初始化。

2postProcessAfterInstantiation调用时机为bean实例化(Instantiation)之后和任何初始化(Initialization)之前。

3postProcessProperties调用时机为postProcessAfterInstantiation方法返回true之后, 返回的PropertyValues将作用于给定bean属性赋值。spring 5.1之后出现的,用来替换@Deprecated标注的postProcessPropertyValues

4postProcessPropertyValues已经被标注@Deprecated,后续将被postProcessProperties取代。

Spring bean的生命周期:

实例化(Instantiation)->属性赋值(Populate)->初始化(Initialization)->销毁(Destruction)

主要逻辑都在doCreateBean()方法中,在该方法中依次调用了以下三个方法:

createBeanInstance() -> 实例化

populateBean() -> 属性赋值

initializeBean() -> 初始化

至于销毁,是在容器关闭时调用的,详见ConfigurableApplicationContext#close()方法。

// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
      throws BeanCreationException {

   // Instantiate the bean.
   BeanWrapper instanceWrapper = null;
   if (instanceWrapper == null) {
       // 实例化阶段!
      instanceWrapper = createBeanInstance(beanName, mbd, args);
   }

   // Initialize the bean instance.
   Object exposedObject = bean;
   try {
       // 属性赋值阶段!
      populateBean(beanName, mbd, instanceWrapper);
       // 初始化阶段!
      exposedObject = initializeBean(beanName, exposedObject, mbd);
   }
}

先区别一下Spring Bean的实例化和初始化两个阶段的主要作用:

1、实例化----实例化的过程是调用构造函数创建对象的过程。

2、初始化----初始化的过程是指调用Bean的初始化方法。常用的初始化方法有:

        1.@PostConstruct注解的方法。

        2.实现InitializingBean接口并重写afterPropertiesSet方法。

        3.XML配置文件在<bean>标签中的init-method属性指定的方法,或者@Bean的initMethod属性指定的方法,如@Bean(initMethod = "init"),其中init是一个方法。

要理解bean的生命周期首先记住两个概念-bean与对象的区别

1.spring bean——经过了完整的spring bean生命周期(有些bean没有经过bean生命周期)并被spring容器管理的对象,最终存在spring容器当中。一个bean一定是个对象。

2.对象——任何符合java语法规则实例化出来的对象,但是一个对象并不一定是spring bean。

所谓的bean的生命周期就是磁盘上的类通过spring扫描,然后实例化,属性注入,接着初始化,继而放到容器当中的过程。

1、spring容器启动的主要流程

// 此处使用的MyConfig.class是一个带有@Configuration注解的类。
// 调用AnnotationConfigApplicationContext类的构造函数创建IoC容器。
public static void main(String[] args) {
   ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
}

// Spring容器的启动流程可以归纳为三个步骤:
public AnnotationConfigApplicationContext(Class... annotatedClasses) {
    //1. 初始化Spring容器,注册spring内置的BeanPostProcessor的BeanDefinition到容器中
    this();
    //2. 将配置类的BeanDefinition注册到容器中(如此例中的MyConfig.class)
    this.register(annotatedClasses);
    //3. 调用refresh()方法刷新容器
    this.refresh();
}

<1>spring容器的初始化,通过this()调用了无参构造函数,主要做了以下三个事情
1)实例化BeanFactoryDefaultListableBeanFactory】工厂,用于生成Bean对象。
2)实例化BeanDefinitionReader注解配置读取器,用于对特定注解(如@Service@Repository)的类进行读取转化成  BeanDefinition 对象,(BeanDefinition  Spring 中极其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)。
3)实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象。
<2>将配置类的BeanDefinition注册到容器中
这个步骤主要是用来解析用户传入的 Spring 配置类,解析成一个 BeanDefinition 然后注册到容器中。
<3>refresh()主要用于容器的刷新,refresh()方法每一步的主要功能如下所示
1prepareRefresh()刷新前的预处理:
1initPropertySources():初始化一些属性设置,子类自定义个性化的属性设置方法;
2getEnvironment().validateRequiredProperties():检验属性的合法性
3earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>():保存容器中的一些早期的事件;
2obtainFreshBeanFactory():获取在容器初始化时创建的BeanFactory
1refreshBeanFactory():刷新BeanFactory,设置序列化ID
2getBeanFactory():返回初始化中的GenericApplicationContext创建的BeanFactory对象,即【DefaultListableBeanFactory】类型
3prepareBeanFactory(beanFactory)BeanFactory的预处理工作,向容器中添加一些组件:
1)设置BeanFactory的类加载器、设置表达式解析器等等
2)添加BeanPostProcessorApplicationContextAwareProcessor
3)设置忽略自动装配的接口:EnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware
4)注册可以解析的自动装配类,即可以在任意组件中通过注解自动注入:BeanFactoryResourceLoaderApplicationEventPublisherApplicationContext
5)添加BeanPostProcessorApplicationListenerDetector
6)添加编译时的AspectJ
7)给BeanFactory中注册的3个组件:environmentConfigurableEnvironment】、systemPropertiesMap<String, Object>】、systemEnvironmentMap<String, Object>
4postProcessBeanFactory(beanFactory):子类重写该方法,可以实现在BeanFactory创建并预处理完成以后做进一步的设置
5invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器:
1)先执行BeanDefinitionRegistryPostProcessor postProcessor.postProcessBeanDefinitionRegistry(registry)
 获取所有的实现了BeanDefinitionRegistryPostProcessor接口类型的集合
 先执行实现了PriorityOrdered优先级接口的BeanDefinitionRegistryPostProcessor
 再执行实现了Ordered顺序接口的BeanDefinitionRegistryPostProcessor
 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessors        
2)再执行BeanFactoryPostProcessor的方法:postProcessor.postProcessBeanFactory(beanFactory)
 获取所有的实现了BeanFactoryPostProcessor接口类型的集合
 先执行实现了PriorityOrdered优先级接口的BeanFactoryPostProcessor
 再执行实现了Ordered顺序接口的BeanFactoryPostProcessor
 最后执行没有实现任何优先级或者是顺序接口的BeanFactoryPostProcessor
6registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能
1)获取所有实现了BeanPostProcessor接口类型的集合:
2)先注册实现了PriorityOrdered优先级接口的BeanPostProcessor
3)再注册实现了Ordered优先级接口的BeanPostProcessor
4)最后注册没有实现任何优先级接口的BeanPostProcessor
5)最r终注册MergedBeanDefinitionPostProcessor类型的BeanPostProcessorbeanFactory.addBeanPostProcessor(postProcessor);
6)给容器注册一个ApplicationListenerDetector:用于在Bean创建完成后检查是否是ApplicationListener,如果是,就把Bean放到容器中保存起来:applicationContext.addApplicationListener((ApplicationListener<?>) bean);
此时容器中默认有6个默认的BeanProcessor(无任何代理模式下):【ApplicationContextAwareProcessor】、【ConfigurationClassPostProcessorsAwareBeanPostProcessor】、【PostProcessorRegistrationDelegate】、【CommonAnnotationBeanPostProcessor】、【AutowiredAnnotationBeanPostProcessor】、【ApplicationListenerDetector
7initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:
1)看BeanFactory容器中是否有idmessageSource 并且类型是MessageSource的组件:如果有,直接赋值给messageSource;如果没有,则创建一个DelegatingMessageSource
2)把创建好的MessageSource注册在容器中,以后获取国际化配置文件的值的时候,可以自动注入MessageSource
8initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到:
1)看BeanFactory容器中是否存在自定义的ApplicationEventMulticaster:如果有,直接从容器中获取;如果没有,则创建一个SimpleApplicationEventMulticaster
2)将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件就可以直接自动注入
9onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑
10registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,并派发之前步骤产生的事件:
1)从容器中拿到所有的ApplicationListener
2)将每个监听器添加到事件派发器中:getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3)派发之前步骤产生的事件applicationEventsgetApplicationEventMulticaster().multicastEvent(earlyEvent);
11finishBeanFactoryInitialization(beanFactory):初始化所有剩下的单实例bean,核心方法是preInstantiateSingletons(),会调用getBean()方法创建对象;
1)获取容器中的所有beanDefinitionName,依次进行初始化和创建对象
2)获取Bean的定义信息RootBeanDefinition,它表示自己的BeanDefinition和可能存在父类的BeanDefinition合并后的对象
3)如果Bean满足这三个条件:非抽象,单实例,非懒加载,则执行单例Bean创建流程    
4)所有Bean都利用getBean()创建完成以后,检查所有的Bean是否为SmartInitializingSingleton接口的,如果是;就执行afterSingletonsInstantiated()
12finishRefresh():发布BeanFactory容器刷新完成事件:
1initLifecycleProcessor():初始化和生命周期有关的后置处理器:默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】,如果没有,则创建一个DefaultLifecycleProcessor()加入到容器;
2getLifecycleProcessor().onRefresh():拿到前面定义的生命周期处理器(LifecycleProcessor)回调onRefresh()方法
3publishEvent(new ContextRefreshedEvent(this)):发布容器刷新完成事件;
4liveBeansView.registerApplicationContext(this);

2、获取和创建bean

下面从入口方法refresh开始分析。

调用AbstractApplicationContext类的refresh方法:

public void refresh() throws BeansException, IllegalStateException {
    Object var1 = this.startupShutdownMonitor;
    synchronized(this.startupShutdownMonitor) {
        this.prepareRefresh();
        ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
        this.prepareBeanFactory(beanFactory);

        try {
            this.postProcessBeanFactory(beanFactory);
            this.invokeBeanFactoryPostProcessors(beanFactory);
	        //注册所有的BeanPostProcessor
            this.registerBeanPostProcessors(beanFactory);
            this.initMessageSource();
            this.initApplicationEventMulticaster();
            this.onRefresh();
            this.registerListeners();
	        //创建bean,bean的生命周期(实例化、属性注入、初始化)就是在这个方法中完成的
            this.finishBeanFactoryInitialization(beanFactory);
            this.finishRefresh();
        } catch (BeansException var9) {
            if (this.logger.isWarnEnabled()) {
                this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
            }

            this.destroyBeans();
            this.cancelRefresh(var9);
            throw var9;
        } finally {
            this.resetCommonCaches();
        }

    }
}

调用AbstractApplicationContext类的finishBeanFactoryInitialization方法完成bean的创建:

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
        beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
    }

    if (!beanFactory.hasEmbeddedValueResolver()) {
        beanFactory.addEmbeddedValueResolver((strVal) -> {
            return this.getEnvironment().resolvePlaceholders(strVal);
        });
    }

    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
    String[] var3 = weaverAwareNames;
    int var4 = weaverAwareNames.length;

    for(int var5 = 0; var5 < var4; ++var5) {
        String weaverAwareName = var3[var5];
        this.getBean(weaverAwareName);
    }

    beanFactory.setTempClassLoader((ClassLoader)null);
    beanFactory.freezeConfiguration();
    beanFactory.preInstantiateSingletons();
}

调用DefaultListableBeanFactory类的preInstantiateSingletons方法实例化单例bean:

public void preInstantiateSingletons() throws BeansException {
    if (this.logger.isTraceEnabled()) {
        this.logger.trace("Pre-instantiating singletons in " + this);
    }

    List<String> beanNames = new ArrayList(this.beanDefinitionNames);
    Iterator var2 = beanNames.iterator();

    while(true) {
        String beanName;
        Object bean;
        do {
            while(true) {
                RootBeanDefinition bd;
                do {
                    do {
                        do {
                            if (!var2.hasNext()) {
                                var2 = beanNames.iterator();

                                while(var2.hasNext()) {
                                    beanName = (String)var2.next();
                                    Object singletonInstance = this.getSingleton(beanName);
                                    if (singletonInstance instanceof SmartInitializingSingleton) {
                                        SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton)singletonInstance;
                                        if (System.getSecurityManager() != null) {
                                            AccessController.doPrivileged(() -> {
                                                smartSingleton.afterSingletonsInstantiated();
                                                return null;
                                            }, this.getAccessControlContext());
                                        } else {
                                            smartSingleton.afterSingletonsInstantiated();
                                        }
                                    }
                                }

                                return;
                            }

                            beanName = (String)var2.next();
		                    //在扫描解析类时将类的信息封装到对应的BeanDefinition对象中
                            bd = this.getMergedLocalBeanDefinition(beanName);
                        } while(bd.isAbstract()); //从bd对象中获取类的信息,判断是否是抽象类
                    } while(!bd.isSingleton()); //判断是否是单例,如果不是单例,就继续循环
                } while(bd.isLazyInit()); //判断是否是懒加载,如果是懒加载,就继续循环

                if (this.isFactoryBean(beanName)) {
                    bean = this.getBean("&" + beanName);
                    break;
                }

                this.getBean(beanName);
            }
        } while(!(bean instanceof FactoryBean));

        FactoryBean<?> factory = (FactoryBean)bean;
        boolean isEagerInit;
        if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
            SmartFactoryBean var10000 = (SmartFactoryBean)factory;
            ((SmartFactoryBean)factory).getClass();
            isEagerInit = ((Boolean)AccessController.doPrivileged(var10000::isEagerInit, this.getAccessControlContext())).booleanValue();
        } else {
            isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
        }

        if (isEagerInit) {
            // 注意:调用AbstractBeanFactory类的getBean方法获取bean
            this.getBean(beanName);
        }
    }
}

调用AbstractBeanFactory类的getBean方法获取bean:

public Object getBean(String name) throws BeansException {
    return this.doGetBean(name, (Class)null, (Object[])null, false);
}

调用AbstractBeanFactory类的doGetBean方法获取bean:

protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
    String beanName = this.transformedBeanName(name);
    //第一次调用getSingleton方法,如果获取到bean,则返回
    Object sharedInstance = this.getSingleton(beanName);
    Object bean;
    if (sharedInstance != null && args == null) {
        if (this.logger.isTraceEnabled()) {
            if (this.isSingletonCurrentlyInCreation(beanName)) {
                this.logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
            } else {
                this.logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }

        bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
    } else {
        if (this.isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }

        BeanFactory parentBeanFactory = this.getParentBeanFactory();
        if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
            String nameToLookup = this.originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
                return ((AbstractBeanFactory)parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);
            }

            if (args != null) {
                return parentBeanFactory.getBean(nameToLookup, args);
            }

            if (requiredType != null) {
                return parentBeanFactory.getBean(nameToLookup, requiredType);
            }

            return parentBeanFactory.getBean(nameToLookup);
        }

        if (!typeCheckOnly) {
            this.markBeanAsCreated(beanName);
        }

        try {
            RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
            this.checkMergedBeanDefinition(mbd, beanName, args);
            String[] dependsOn = mbd.getDependsOn();
            String[] var11;
            if (dependsOn != null) {
                var11 = dependsOn;
                int var12 = dependsOn.length;

                for(int var13 = 0; var13 < var12; ++var13) {
                    String dep = var11[var13];
                    if (this.isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                    }

                    this.registerDependentBean(dep, beanName);

                    try {
                        this.getBean(dep);
                    } catch (NoSuchBeanDefinitionException var24) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var24);
                    }
                }
            }

            if (mbd.isSingleton()) {
	            //第二次调用getSingleton方法
                sharedInstance = this.getSingleton(beanName, () -> {
                    try {
                        // 重点:调用AbstractAutowireCapableBeanFactory类的createBean方法创建bean
                        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()) {
                var11 = null;

                Object prototypeInstance;
                try {
                    this.beforePrototypeCreation(beanName);
                    prototypeInstance = this.createBean(beanName, mbd, args);
                } finally {
                    this.afterPrototypeCreation(beanName);
                }

                bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            } else {
                String scopeName = mbd.getScope();
                Scope scope = (Scope)this.scopes.get(scopeName);
                if (scope == null) {
                    throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                }

                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        this.beforePrototypeCreation(beanName);

                        Object var4;
                        try {
                            var4 = this.createBean(beanName, mbd, args);
                        } finally {
                            this.afterPrototypeCreation(beanName);
                        }

                        return var4;
                    });
                    bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                } catch (IllegalStateException var23) {
                    throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var23);
                }
            }
        } catch (BeansException var26) {
            this.cleanupAfterBeanCreationFailure(beanName);
            throw var26;
        }
    }

    if (requiredType != null && !requiredType.isInstance(bean)) {
        try {
            T convertedBean = this.getTypeConverter().convertIfNecessary(bean, requiredType);
            if (convertedBean == null) {
                throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
            } else {
                return convertedBean;
            }
        } catch (TypeMismatchException var25) {
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var25);
            }

            throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
        }
    } else {
        return bean;
    }
}

调用AbstractAutowireCapableBeanFactory类的createBean方法创建bean:

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

    RootBeanDefinition mbdToUse = mbd;
    Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

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

    Object beanInstance;
    try {
        //创建bean之前执行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法
        beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
        if (beanInstance != null) {
            return beanInstance;
        }
    } catch (Throwable var10) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var10);
    }

    try {
        //创建bean
        beanInstance = this.doCreateBean(beanName, mbdToUse, args);
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Finished creating instance of bean '" + beanName + "'");
        }

        return beanInstance;
    } catch (ImplicitlyAppearedSingletonException | BeanCreationException var7) {
        throw var7;
    } catch (Throwable var8) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", var8);
    }
}

在调用doCreateBean方法创建bean之前,先来分析一下resolveBeforeInstantiation方法。

调用抽象类AbstractAutowireCapableBeanFactory的resolveBeforeInstantiation方法:

@Nullable
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    //如果beforeInstantiationResolved还没有设置或者是false(说明还没有需要在实例化前执行的操作)
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        // 判断是否向IoC容器注册过InstantiationAwareBeanPostProcessor类型的bean
        if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
            Class<?> targetType = this.determineTargetType(beanName, mbd);
            if (targetType != null) {
                //如果bean为null,直接返回,执行doCreateBean方法创建bean
                bean = this.applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                if (bean != null) {
                    //如果bean不为null,说明bean已存在,直接调用初始化后的后置方法
                    bean = this.applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }

        mbd.beforeInstantiationResolved = bean != null;
    }

    return bean;
}


@Nullable
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
    Iterator var3 = this.getBeanPostProcessors().iterator();

    while(var3.hasNext()) {
        BeanPostProcessor bp = (BeanPostProcessor)var3.next();
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp =(InstantiationAwareBeanPostProcessor)bp;
            //只要有一个result不为null,说明bean已存在,后面所有后置处理器的该方法都不执行,直接返回(所以执行顺序很重要)
            Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
            if (result != null) {
                return result;
            }
        }
    }

    return null;
}

AbstractAutowireCapableBeanFactory的applyBeanPostProcessorsAfterInitialization方法:

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {
    Object result = existingBean;

    Object current;
    for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
        BeanPostProcessor processor = (BeanPostProcessor)var4.next();
        //经过初始化后的后置处理器得到的对象如果为null,则后面所有后置处理器的该方法都不执行,直接返回前面获取的bean给IoC容器(所以执行顺序很重要)。
        current = processor.postProcessAfterInitialization(result, beanName);
        if (current == null) {
            return result;
        }
    }

    return result;
}

调用AbstractAutowireCapableBeanFactory类的doCreateBean方法创建bean:

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) {
        //推断出构造函数,通过构造函数反射创建bean实例
        instanceWrapper = this.createBeanInstance(beanName, mbd, args);
    }

    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    Object var7 = mbd.postProcessingLock;
    synchronized(mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                //通过不同的后置处理器完成对相应注解的扫描工作,并将相关的可用方法或其它有用信息进行缓存
                this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            } catch (Throwable var17) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
            }

            mbd.postProcessed = true;
        }
    }
    //如果是单例、允许循环依赖且正在创建中,则提前暴露一个工厂ObjectFactory<?> singletonFactory
    boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
    if (earlySingletonExposure) {
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
        }

        this.addSingletonFactory(beanName, () -> {
            return this.getEarlyBeanReference(beanName, mbd, bean);
        });
    }

    Object exposedObject = bean;

    try {
        //属性注入
        this.populateBean(beanName, mbd, instanceWrapper);
        //初始化bean
        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);
    }

    if (earlySingletonExposure) {
        Object earlySingletonReference = this.getSingleton(beanName, false);
        if (earlySingletonReference != null) {
            if (exposedObject == bean) {
                exposedObject = earlySingletonReference;
            } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
                String[] dependentBeans = this.getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                String[] var12 = dependentBeans;
                int var13 = dependentBeans.length;

                for(int var14 = 0; var14 < var13; ++var14) {
                    String dependentBean = var12[var14];
                    if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }

                if (!actualDependentBeans.isEmpty()) {
                    throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
                }
            }
        }
    }

    try {
        this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
        return exposedObject;
    } catch (BeanDefinitionValidationException var16) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
    }
}

在上面doCreateBean方法中依次调用了createBeanInstance、isSingletonCurrentlyInCreation、addSingletonFactory、populateBean和initializeBean等方法,下面简单看一下这些方法。

2.1、bean的实例化

调用AbstractAutowireCapableBeanFactory类的createBeanInstance方法创建bean实例:

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    //解析class
    Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    //确保class不为空,并且访问权限为public
    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    } else {
        //配置的一种特殊的callback回调方法,通过这个callback创建bean
        Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
        if (instanceSupplier != null) {
            return this.obtainFromSupplier(instanceSupplier, beanName);
        } else if (mbd.getFactoryMethodName() != null) {
            //通过工厂方法创建
            return this.instantiateUsingFactoryMethod(beanName, mbd, args);
        } else {
            boolean resolved = false;
            boolean autowireNecessary = false;
            if (args == null) {
                Object var8 = mbd.constructorArgumentLock;
                synchronized(mbd.constructorArgumentLock) {
                    //在使用构造器创建实例后,Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,避免创建相同bean时再次解析。若已使用构造器或工厂方法创建过实例,resolvedConstructorOrFactoryMethod 的值不为null,该变量在下面autowireConstructor方法中被设置。
                    if (mbd.resolvedConstructorOrFactoryMethod != null) {
                        resolved = true;
                        autowireNecessary = mbd.constructorArgumentsResolved;
                    }
                }
            }
	        //已经解析过class的构造器,使用已经解析好的构造器或者默认构造器
            if (resolved) {
                return autowireNecessary ? this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null) : this.instantiateBean(beanName, mbd);
            } else {
	            //推断出构造方法,根据参数个数、类型确定需要调用的构造器
                Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
                if (ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args)) {
                    ctors = mbd.getPreferredConstructors();
		            //若解析出的构造函数不为空,则使用构造函数自动注入,否则使用默认构造器
                    return ctors != null ? this.autowireConstructor(beanName, mbd, ctors, (Object[])null) : this.instantiateBean(beanName, mbd);
                } else {
		            //使用解析出的构造函数创建实例
                    return this.autowireConstructor(beanName, mbd, ctors, args);
                }
            }
        }
    }
}

调用DefaultSingletonBeanRegistry类的isSingletonCurrentlyInCreation方法判断单例bean是否正在创建中,该方法中的singletonsCurrentlyInCreation是一个Set集合,如果单例bean正在创建中,会将正在创建的bean放到该集合中(这一步在AbstractBeanFactory类的doGetBean方法中第二次调用getSingleton方法时完成的),创建完成之后,从该集合中删除bean。

private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap(16));


public boolean isSingletonCurrentlyInCreation(String beanName) {
    return this.singletonsCurrentlyInCreation.contains(beanName);
}

调用DefaultSingletonBeanRegistry类的addSingletonFactory方法,若一级缓存singletonObjects中不包含bean,则将该bean及其对应的singletonFactory放到二级缓存singletonFactories中,同时删除三级缓存earlySingletonObjects中的bean。

protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(singletonFactory, "Singleton factory must not be null");
    Map var3 = this.singletonObjects;
    synchronized(this.singletonObjects) {
        if (!this.singletonObjects.containsKey(beanName)) {
            this.singletonFactories.put(beanName, singletonFactory);
            this.earlySingletonObjects.remove(beanName);
            this.registeredSingletons.add(beanName);
        }

    }
}

2.2、属性注入

调用AbstractAutowireCapableBeanFactory类的populateBean方法完成属性注入:

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    if (bw == null) {
        if (mbd.hasPropertyValues()) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
        }
    } else {
        boolean continueWithPropertyPopulation = true;
        if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
            Iterator var5 = this.getBeanPostProcessors().iterator();

            while(var5.hasNext()) {
                BeanPostProcessor bp = (BeanPostProcessor)var5.next();
                if (bp instanceof InstantiationAwareBeanPostProcessor) {
                    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                    //在实例化之后属性注入之前,调用postProcessAfterInstantiation方法,若返回false,不注入属性
                    if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                        continueWithPropertyPopulation = false;
                        break;
                    }
                }
            }
        }
        //若postProcessAfterInstantiation方法返回false,则不执行属性注入
        if (continueWithPropertyPopulation) {
	        //若对象(此时还是半成品的bean)具有属性,则获取属性的值
            PropertyValues pvs = mbd.hasPropertyValues() ? mbd.getPropertyValues() : null;
            if (mbd.getResolvedAutowireMode() == 1 || mbd.getResolvedAutowireMode() == 2) {
                MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);
	            //若自动注入类型是1,则按名称注入
                if (mbd.getResolvedAutowireMode() == 1) {
                    this.autowireByName(beanName, mbd, bw, newPvs);
                }
	            //若自动注入类型是2,则按类型注入
                if (mbd.getResolvedAutowireMode() == 2) {
                    this.autowireByType(beanName, mbd, bw, newPvs);
                }

                pvs = newPvs;
            }
            //是否具有InstantiationAwareBeanPostProcessors,用于判断是否要执行postProcessProperties
            boolean hasInstAwareBpps = this.hasInstantiationAwareBeanPostProcessors();
	        //依赖注入校验标志位,是否需要进行依赖检查
            boolean needsDepCheck = mbd.getDependencyCheck() != 0;
            PropertyDescriptor[] filteredPds = null;
            if (hasInstAwareBpps) {
                if (pvs == null) {
                    pvs = mbd.getPropertyValues();
                }

                Iterator var9 = this.getBeanPostProcessors().iterator();

                while(var9.hasNext()) {
                    BeanPostProcessor bp = (BeanPostProcessor)var9.next();
                    if (bp instanceof InstantiationAwareBeanPostProcessor) {
                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
                        //@Autowired、@Value或@Resource注解的属性就是在postProcessProperties或postProcessPropertyValues方法中完成属性注入的
                        PropertyValues pvsToUse = ibp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName);
                        if (pvsToUse == null) {
                            if (filteredPds == null) {
                                filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                            }

                            pvsToUse = ibp.postProcessPropertyValues((PropertyValues)pvs, filteredPds, bw.getWrappedInstance(), beanName);
                            if (pvsToUse == null) {
                                return;
                            }
                        }

                        pvs = pvsToUse;
                    }
                }
            }

            if (needsDepCheck) {
                if (filteredPds == null) {
                    filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }

                this.checkDependencies(beanName, mbd, filteredPds, (PropertyValues)pvs);
            }

	        //配置文件中<property>配置的属性就是在这里完成注入的
            if (pvs != null) {
                this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
            }

        }
    }
}

2.3、bean的初始化

调用AbstractAutowireCapableBeanFactory类的initializeBean方法完成bean的初始化:

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()) {
        //bean初始化之前调用postProcessBeforeInitialization方法
        wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
    }

    try {
        //bean的初始化
        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()) {
        //bean初始化之后调用postProcessAfterInitialization方法
        wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值