finishBeanFactoryInitialization(beanFactory); 很重要的一步,初始化剩余未初始化的bean(还没有创建实例放到容器中的)。

容器refresh总览:

     synchronized (this.startupShutdownMonitor) {// 设置环境,校验参数。prepareRefresh();// 创建BeanFactory(DefaultListableBeanFactor),加载bean定义信息。ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// 对BeanFactory设置prepareBeanFactory(beanFactory);try {// 留给子类去实现,完成对beanFactory的自定义处理postProcessBeanFactory(beanFactory);// 调用beanFactory的后置处理器invokeBeanFactoryPostProcessors(beanFactory);// 注册bean后置处理器registerBeanPostProcessors(beanFactory);// 初始化messageSource,国际化支持initMessageSource();// 初始化事件派发器initApplicationEventMulticaster();// 留给子类实现,自定义处理onRefresh();// 注册事件监听器registerListeners();// 初始化所有剩余的非懒加载的单实例beanfinishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();}catch (BeansException ex) {if (logger.isWarnEnabled()) {logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);}// Destroy already created singletons to avoid dangling resources.destroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}finally {// Reset common introspection caches in Spring's core, since we// might not ever need metadata for singleton beans anymore...resetCommonCaches();}}

finishBeanFactoryInitialization

 protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {// 用于类型之间的转换,在Spring里其实就是把配置文件中的String转为其它类型if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));}// 注册一个StringValueResolver,用于字符占位符的解析if (!beanFactory.hasEmbeddedValueResolver()) {beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));}String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);for (String weaverAwareName : weaverAwareNames) {getBean(weaverAwareName);}// Stop using the temporary ClassLoader for type matching.beanFactory.setTempClassLoader(null);// Allow for caching all bean definition metadata, not expecting further changes.beanFactory.freezeConfiguration();// Instantiate all remaining (non-lazy-init) singletons.beanFactory.preInstantiateSingletons();}

preInstantiateSingletons

初始化剩余的单实例bean(非懒加载)

 @Overridepublic void preInstantiateSingletons() throws BeansException {if (logger.isDebugEnabled()) {logger.debug("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {// 获取bean定义信息RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {// 如果是FactoryBean,安全检查,也是通过getBean获取实例if (isFactoryBean(beanName)) {// 工厂bean把名字添加一个&前缀Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {final FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {// 获取beangetBean(beanName);}}}// 在剩余的bean初始化完成后调用SmartInitializingSingleton的afterSingletonsInstantiated方法for (String beanName : beanNames) {// 根据名字从容器中获取beanObject singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}}
getBean

获取bean实例

// AbstractFactoryBean@Overridepublic Object getBean(String name) throws BeansException {// 第二个参数表示bean的Class类型,第三个表示创建bean需要的参数,最后一个表示不需要进行类型检查。return doGetBean(name, null, null, false);}
```2doGetBean```java
// AbstractFactoryBeanprotected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {// 将FactoryBean的前缀去掉以及将别名转为真实的名字。final String beanName = transformedBeanName(name);Object bean;// 检查是否之间已经注册过Object sharedInstance = getSingleton(beanName);if (sharedInstance != null && args == null) {if (logger.isDebugEnabled()) {if (isSingletonCurrentlyInCreation(beanName)) {logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +"' that is not fully initialized yet - a consequence of a circular reference");}else {logger.debug("Returning cached instance of singleton bean '" + beanName + "'");}}// 检查是否是工厂bean,如果是Factorybean使用getObject()创建实例,否则直接返回正常的实例bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);}else {// Fail if we're already creating this bean instance:// We're assumably within a circular reference.if (isPrototypeCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName);}BeanFactory parentBeanFactory = getParentBeanFactory();// 如果有父工厂,并且当前工厂中没有bean的定义信息,那么交由父工厂注册beanif (parentBeanFactory != null && !containsBeanDefinition(beanName)) {// Not found -> check parent.String nameToLookup = originalBeanName(name);if (parentBeanFactory instanceof AbstractBeanFactory) {return ((AbstractBeanFactory) parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);}else if (args != null) {// Delegation to parent with explicit args.return (T) parentBeanFactory.getBean(nameToLookup, args);}else {// No args -> delegate to standard getBean method.return parentBeanFactory.getBean(nameToLookup, requiredType);}}if (!typeCheckOnly) {markBeanAsCreated(beanName);}try {// 获取bean定义信息final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// 获取bean依赖保证依赖被注册String[] dependsOn = mbd.getDependsOn();if (dependsOn != null) {// 检查是否循环依赖,注册beanfor (String dep : dependsOn) {if (isDependent(beanName, dep)) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");}// 注册依赖信息registerDependentBean(dep, beanName);try {// 先加载依赖的类getBean(dep);}catch (NoSuchBeanDefinitionException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"'" + beanName + "' depends on missing bean '" + dep + "'", ex);}}}// bean是单例的如何创建,默认都是单例的,除非配合 scopeif (mbd.isSingleton()) {// getSingleton创建并保存但实例的beansharedInstance = getSingleton(beanName, () -> {try {// 创建bean实例return createBean(beanName, mbd, args);}catch (BeansException ex) {destroySingleton(beanName);throw ex;}});// 检查是否是工厂bean,如果是Factorybean使用getObject()创建实例,否则直接返回正常的实例bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}else if (mbd.isPrototype()) {// It's a prototype -> create a new instance.Object prototypeInstance = null;try {beforePrototypeCreation(beanName);// 直接返回一个实例prototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}// 检查是否是工厂bean,如果是Factorybean使用getObject()创建实例,否则直接返回正常的实例bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}else {// 其他scope配置创建方式String scopeName = mbd.getScope();final 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, () -> {beforePrototypeCreation(beanName);try {return createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {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",ex);}}}catch (BeansException ex) {cleanupAfterBeanCreationFailure(beanName);throw ex;}}// Check if required type matches the type of the actual bean instance.if (requiredType != null && !requiredType.isInstance(bean)) {try {T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);if (convertedBean == null) {throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}return convertedBean;}catch (TypeMismatchException ex) {if (logger.isDebugEnabled()) {logger.debug("Failed to convert bean '" + name + "' to required type '" +ClassUtils.getQualifiedName(requiredType) + "'", ex);}throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());}}return (T) bean;}

主要的创建步骤

 protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {if (logger.isDebugEnabled()) {logger.debug("Creating instance of bean '" + beanName + "'");}RootBeanDefinition mbdToUse = mbd;// 确保beanDefinition中有ClassClass<?> resolvedClass = resolveBeanClass(mbd, beanName);if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {mbdToUse = new RootBeanDefinition(mbd);mbdToUse.setBeanClass(resolvedClass);}// 用于检测lookup-method标签配置的方法(不怎么常用,参考https://blog.csdn.net/qq_22912803/article/details/52503914)try {mbdToUse.prepareMethodOverrides();}catch (BeanDefinitionValidationException ex) {throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),beanName, "Validation of method overrides failed", ex);}try {// 调用 InstantiationAwareBeanPostProcess的 postProcessBeforeInstantiation 和 postProcessAfterInstantiation 方法,// 在构造bean之前之后进行一些处理Object bean = resolveBeforeInstantiation(beanName, mbdToUse);if (bean != null) {return bean;}}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,"BeanPostProcessor before instantiation of bean failed", ex);}try {// InstantiationAwareBeanPostProcess的 postProcessBeforeInstantiation 没有返回实例,那么自己创建Object beanInstance = doCreateBean(beanName, mbdToUse, args);if (logger.isDebugEnabled()) {logger.debug("Finished creating instance of bean '" + beanName + "'");}return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {throw ex;}catch (Throwable ex) {throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);}}

resolveBeforeInstantiation(beanName, mbdToUse); 的调用

 @Nullableprotected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {Object bean = null;if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {// Make sure bean class is actually resolved at this point.if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {Class<?> targetType = determineTargetType(beanName, mbd);if (targetType != null) {// 从工厂中获取所有InstantiationAwareBeanPostProcessor进行调用bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);// 如果postProcessBeforeInstantiation 返回了bean,只用after,后续的创建bean流程也不执行if (bean != null) {bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);}}}mbd.beforeInstantiationResolved = (bean != null);}return bean;}@Nullableprotected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {for (BeanPostProcessor bp : getBeanPostProcessors()) {if (bp instanceof InstantiationAwareBeanPostProcessor) {InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);if (result != null) {return result;}}}return null;}

doCreateBean,具体如何创建bean 的

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)throws BeanCreationException {// Instantiate the bean.BeanWrapper instanceWrapper = null;if (mbd.isSingleton()) {instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);}if (instanceWrapper == null) {// 创建bean实例instanceWrapper = createBeanInstance(beanName, mbd, args);}final Object bean = instanceWrapper.getWrappedInstance();Class<?> beanType = instanceWrapper.getWrappedClass();if (beanType != NullBean.class) {mbd.resolvedTargetType = beanType;}// Allow post-processors to modify the merged bean definition.synchronized (mbd.postProcessingLock) {if (!mbd.postProcessed) {try {// 应用MergedBeanDefinitionPostProcessor允许修改定义信息applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Post-processing of merged bean definition failed", ex);}mbd.postProcessed = true;}}// Eagerly cache singletons to be able to resolve circular references// even when triggered by lifecycle interfaces like BeanFactoryAware.// 解决bean的循环依赖问题,可以参考https://blog.csdn.net/u014634338/article/details/83866305boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&isSingletonCurrentlyInCreation(beanName));if (earlySingletonExposure) {if (logger.isDebugEnabled()) {logger.debug("Eagerly caching bean '" + beanName +"' to allow for resolving potential circular references");}addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));}// Initialize the bean instance.Object exposedObject = bean;try {// 调用InstantiationAwareBeanPostProcessor,对应的方法。根据autowire类型进行autowire by name,by type 或者是直接进行属性赋值populateBean(beanName, mbd, instanceWrapper);// 这这里调用bean指定的init方法,和应用beanPostProcessorexposedObject = initializeBean(beanName, exposedObject, mbd);}catch (Throwable ex) {if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {throw (BeanCreationException) ex;}else {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);}}if (earlySingletonExposure) {Object earlySingletonReference = getSingleton(beanName, false);if (earlySingletonReference != null) {if (exposedObject == bean) {exposedObject = earlySingletonReference;}else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {String[] dependentBeans = getDependentBeans(beanName);Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);for (String dependentBean : dependentBeans) {if (!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.");}}}}// Register bean as disposable.try {// 注册容器销毁时bean的处理,也就是调用bean指定的destroy方法registerDisposableBeanIfNecessary(beanName, bean, mbd);}catch (BeanDefinitionValidationException ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);}return exposedObject;}

createBeanInstance创建的方式可以分为三种,在创建bean实例的时候有抽取了一层策略模式,通过策略来真正的创建bean.

  1. 工厂bean创建实例

这里的工厂创建bean是配置了factory-bean/factory-method属性的bean,不是实现了FacrotyBean接口的bean。如果没有配置factory-bean属性,那么factory-method指向的方法必须是静态的。(大致的流程就是拿到配置的工厂bean,反射调用指定的方法)

// createBeanInstanceif (mbd.getFactoryMethodName() != null)  {return instantiateUsingFactoryMethod(beanName, mbd, args);}protected BeanWrapper instantiateUsingFactoryMethod(String beanName, RootBeanDefinition mbd, @Nullable Object[] explicitArgs) {return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);}
  1. 构造器自动装配

自动装配是看所有的SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors()方法,是否有指定对于类型的构造器。

     // Need to determine the constructor...Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null ||mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {return autowireConstructor(beanName, mbd, ctors, args);}
  1. 默认无参构造器
     // No special handling: simply use no-arg constructor.return instantiateBean(beanName, mbd);

Spring容器创建流程(8)初始化bean相关推荐

  1. Spring容器创建流程——总结

    spring容器创建的主要流程在他的refresh()方法中,接下来就开始总结一个下他的refresh()方法中的每个步骤大概都做了那些事情.refresh() 可在AbstractApplicati ...

  2. Spring容器创建流程(1)容器创建准备

    本系列文章将逐一介绍,Spring容器创建到容器刷新完成每个过程. Spring容器继承结构图 第一步,new容器实例 ApplicationContext factory = new ClassPa ...

  3. spring系列-注解驱动原理及源码-spring容器创建流程

    目录 一.spring容器的refresh()[创建刷新] 二.BeanFactory 的创建及预准备工作 1.prepareRefresh()刷新前预处理工作. 2.obtainFreshBeanF ...

  4. Spring容器创建流程(4)调用beanFactory后置处理器

    postProcessBeanFactory() 方法留给子类去实现. invokeBeanFactoryPostProcessors() 调用bean工厂的后置处理器(以前的执行流程可在系列文章中查 ...

  5. Spring容器创建流程(2)创建beanFactory,加载BeanDefinition

    Spring 容器的创建.obtainFreshBeanFactorr()中完成容器的创建.(BeanFactory关系类图,之前的执行流程可在本系列博客中看到).接下来看容器创建的第二部,创建bea ...

  6. Spring容器创建流程(9)完成创建

    Spring的refresh() 方法中finishRefresh()方法完成之后也就代表着,Spring容器真正的创建完成了.下面看finishRefresh()的源码. 容器refresh总览: ...

  7. Spring容器创建流程(5)bean后置处理之注册

    registerBeanPostProcessors 注册bean的后置处理器(以前的执行流程可在系列文章中查看),注意 beanFactoryPostProcessor 是 bean工厂的后置处理器 ...

  8. Spring容器创建流程(3)对beanFactory设置

    容器已经创建完成,接下来 执行prepareBeanFactory(),对BeanFactory做一些设置与准备工作.(之前的执行流程可在本系列博客中看到) 容器refresh 总览: synchro ...

  9. Spring容器创建流程(7)事件派发机制

    Spring事件驱动,监听机制.由三步分组成,事件,派发器,监听器. 事件: spring事件的顶级父类是EventObject,通常情况下继承ApplicationEvent 自定义自己的事件. 事 ...

最新文章

  1. Ansible03-管理变量、加密、事实
  2. linux遭入侵挖矿进程被隐藏案例分析
  3. 梳理一下我理解的aop
  4. 信息系统项目管理师:第4章:项目整体管理与变更管理-章节真题
  5. EAE:自编码器 + BN + 最大熵 = 生成模型
  6. 反射_获取字节码Class对象的三种方式
  7. ubuntu 开启ssh_CS学习笔记 | 22、通过SSH开通通道
  8. 近期资料分享汇总,还不快来看看你漏了哪份没拿?
  9. JDK 8中方便的新地图默认方法
  10. 通配符?子字符串匹配主字符串次数_leetcode 44 通配符匹配(c++)
  11. python插值算法实现_图像插值算法Opencv+python实现
  12. 集装箱装柜计算机器在线,装箱大师在线计算教程
  13. IDEA远程调试代码
  14. Android 百度地图经纬度精确位数,百度map定位 为什么经纬度是准确的 而在map上标注却偏离很远...
  15. android刷机包基带,手机刷机有必要刷底包基带吗?刷安卓机中基带/底包/固件详解...
  16. 智能驾驶中预期安全系统的架构
  17. DE2-115 以太网通信之一88E1111网卡接收PC数据
  18. Windows10 Hyper-v 虚拟机安装点心云,实现闲置宽带共享。
  19. 高并发服务端分布式系统设计概要
  20. 唐朝乐队第三张专辑《浪漫骑士》6月上市.

热门文章

  1. 使用宽度优先搜索的常见场景
  2. python数据挖掘学习笔记】十六.逻辑回归LogisticRegression分析鸢尾花数据
  3. ROS 中文教程目录(最好不要过度依赖这种,建议养成看英文原版习惯)
  4. Android,UbuntuCore,ROS;TuringOS,iBotOS,ROOBO
  5. 400是什么错误_Spring Boot的REST API错误处理
  6. 清明档总票房仅1.2亿元 全国影院营业比例不足50%
  7. 华为第二批“十大军团”正式成立!
  8. 互联网大厂“抢填”高考志愿
  9. 月球好忙 蓝色起源2024年要将首位女性送上月球表面
  10. 618期间, “直播带货”翻车负面信息暴增