ToB企服应用市场:ToB评测及商务社交产业平台

标题: spring启动流程 (2) Bean实例化流程 [打印本页]

作者: 笑看天下无敌手    时间: 2023-7-2 15:09
标题: spring启动流程 (2) Bean实例化流程
本文通过阅读Spring源码,分析Bean实例化流程。
Bean实例化入口

上一篇文章已经介绍,Bean实例化入口在AbstractApplicationContext类的finishBeanFactoryInitialization方法:
  1. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  2.         // Initialize conversion service for this context.
  3.         if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
  4.                         beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
  5.                 beanFactory.setConversionService(
  6.                                 beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
  7.         }
  8.         // Register a default embedded value resolver if no bean post-processor
  9.         // (such as a PropertyPlaceholderConfigurer bean) registered any before:
  10.         // at this point, primarily for resolution in annotation attribute values.
  11.         if (!beanFactory.hasEmbeddedValueResolver()) {
  12.                 beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
  13.         }
  14.         // Initialize LoadTimeWeaverAware beans early to allow for registering their transformers early.
  15.         String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  16.         for (String weaverAwareName : weaverAwareNames) {
  17.                 getBean(weaverAwareName);
  18.         }
  19.         // Stop using the temporary ClassLoader for type matching.
  20.         beanFactory.setTempClassLoader(null);
  21.         // Allow for caching all bean definition metadata, not expecting further changes.
  22.         beanFactory.freezeConfiguration();
  23.         // Instantiate all remaining (non-lazy-init) singletons.
  24.         // 实例化Bean
  25.         beanFactory.preInstantiateSingletons();
  26. }
复制代码
Bean实例化流程
  1. public void preInstantiateSingletons() throws BeansException {
  2.         // Iterate over a copy to allow for init methods which in turn register new bean definitions.
  3.         // While this may not be part of the regular factory bootstrap, it does otherwise work fine.
  4.         List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
  5.         // Trigger initialization of all non-lazy singleton beans...
  6.         for (String beanName : beanNames) {
  7.                 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
  8.                 // 判断非抽象,单例且非懒加载
  9.                 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
  10.                         // 判断FactoryBean
  11.                         if (isFactoryBean(beanName)) {
  12.                                 // 使用"&beanName"格式作为beanName去创建Bean实例
  13.                                 Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
  14.                                 if (bean instanceof FactoryBean) {
  15.                                         FactoryBean<?> factory = (FactoryBean<?>) bean;
  16.                                         boolean isEagerInit;
  17.                                         if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
  18.                                                 isEagerInit = AccessController.doPrivileged(
  19.                                                                 (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
  20.                                                                 getAccessControlContext());
  21.                                         } else {
  22.                                                 isEagerInit = (factory instanceof SmartFactoryBean &&
  23.                                                                 ((SmartFactoryBean<?>) factory).isEagerInit());
  24.                                         }
  25.                                         if (isEagerInit) {
  26.                                                 getBean(beanName);
  27.                                         }
  28.                                 }
  29.                         } else {
  30.                                 // 普通的Bean
  31.                                 getBean(beanName);
  32.                         }
  33.                 }
  34.         }
  35.         // Trigger post-initialization callback for all applicable beans...
  36.         // 此分支暂时不做分析
  37.         for (String beanName : beanNames) {
  38.                 Object singletonInstance = getSingleton(beanName);
  39.                 if (singletonInstance instanceof SmartInitializingSingleton) {
  40.                         SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
  41.                         if (System.getSecurityManager() != null) {
  42.                                 AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  43.                                         smartSingleton.afterSingletonsInstantiated();
  44.                                         return null;
  45.                                 }, getAccessControlContext());
  46.                         } else {
  47.                                 smartSingleton.afterSingletonsInstantiated();
  48.                         }
  49.                 }
  50.         }
  51. }
复制代码
getBean(beanName)方法
  1. public Object getBean(String name) throws BeansException {
  2.         return doGetBean(name, null, null, false);
  3. }
  4. protected <T> T doGetBean(
  5.                 String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly)
  6.                 throws BeansException {
  7.         // 去除name的&前缀
  8.         String beanName = transformedBeanName(name);
  9.         Object bean;
  10.         // 依次从singletonObjects, earlySingletonObjects, singletonFactories获取单例Bean
  11.         // 如果找到了就不需要创建了
  12.         Object sharedInstance = getSingleton(beanName);
  13.         if (sharedInstance != null && args == null) {
  14.                 // Get the object for the given bean instance,
  15.                 // either the bean instance itself or its created object in case of a FactoryBean.
  16.                 // name参数是调用getBean方法时传递的原始BeanName,可能前缀&符用于获取FactoryBean实例
  17.                 // beanName参数是去除&符前缀后的BeanName
  18.                 bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  19.         } else {
  20.                 // Fail if we're already creating this bean instance:
  21.                 // We're assumably within a circular reference.
  22.                 if (isPrototypeCurrentlyInCreation(beanName)) {
  23.                         throw new BeanCurrentlyInCreationException(beanName);
  24.                 }
  25.                 // 如果当前BeanFactory没有指定Bean则从父级BeanFactory获取Bean实例
  26.                 BeanFactory parentBeanFactory = getParentBeanFactory();
  27.                 if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  28.                         // Not found -> check parent.
  29.                         String nameToLookup = originalBeanName(name);
  30.                         if (parentBeanFactory instanceof AbstractBeanFactory) {
  31.                                 return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  32.                                                 nameToLookup, requiredType, args, typeCheckOnly);
  33.                         } else if (args != null) {
  34.                                 // Delegation to parent with explicit args.
  35.                                 return (T) parentBeanFactory.getBean(nameToLookup, args);
  36.                         } else if (requiredType != null) {
  37.                                 // No args -> delegate to standard getBean method.
  38.                                 return parentBeanFactory.getBean(nameToLookup, requiredType);
  39.                         } else {
  40.                                 return (T) parentBeanFactory.getBean(nameToLookup);
  41.                         }
  42.                 }
  43.                 // whether the instance is obtained for a type check, not for actual use
  44.                 if (!typeCheckOnly) {
  45.                         markBeanAsCreated(beanName);
  46.                 }
  47.                 try {
  48.                         RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  49.                         checkMergedBeanDefinition(mbd, beanName, args);
  50.                         // 创建DependsOn的Bean
  51.                         String[] dependsOn = mbd.getDependsOn();
  52.                         if (dependsOn != null) {
  53.                                 for (String dep : dependsOn) {
  54.                                         // 判断循环依赖
  55.                                         if (isDependent(beanName, dep)) {
  56.                                                 throw new BeanCreationException(
  57.                             mbd.getResourceDescription(), beanName, "循环依赖");
  58.                                         }
  59.                                         registerDependentBean(dep, beanName);
  60.                                         try {
  61.                                                 getBean(dep);
  62.                                         } catch (NoSuchBeanDefinitionException ex) {
  63.                                                 throw new BeanCreationException(
  64.                             mbd.getResourceDescription(), beanName, "依赖的Bean不存在", ex);
  65.                                         }
  66.                                 }
  67.                         }
  68.                         // 此分支获取单例Bean
  69.                         if (mbd.isSingleton()) {
  70.                                 sharedInstance = getSingleton(beanName, () -> {
  71.                                         try {
  72.                                                 return createBean(beanName, mbd, args);
  73.                                         } catch (BeansException ex) {
  74.                                                 // Explicitly remove instance from singleton cache: It might have been put there
  75.                                                 // eagerly by the creation process, to allow for circular reference resolution.
  76.                                                 // Also remove any beans that received a temporary reference to the bean.
  77.                                                 destroySingleton(beanName);
  78.                                                 throw ex;
  79.                                         }
  80.                                 });
  81.                                 bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  82.                         } else if (mbd.isPrototype()) {
  83.                                 // 此分支获取Prototype类型的Bean
  84.                                 Object prototypeInstance = null;
  85.                                 try {
  86.                                         beforePrototypeCreation(beanName);
  87.                                         prototypeInstance = createBean(beanName, mbd, args);
  88.                                 } finally {
  89.                                         afterPrototypeCreation(beanName);
  90.                                 }
  91.                                 bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  92.                         } else {
  93.                                 String scopeName = mbd.getScope();
  94.                                 if (!StringUtils.hasLength(scopeName)) {
  95.                                         throw new IllegalStateException("No scope name defined for bean ´" + beanName + "'");
  96.                                 }
  97.                                 Scope scope = this.scopes.get(scopeName);
  98.                                 if (scope == null) {
  99.                                         throw new IllegalStateException("No Scope registered for scope name");
  100.                                 }
  101.                                 try {
  102.                                         Object scopedInstance = scope.get(beanName, () -> {
  103.                                                 beforePrototypeCreation(beanName);
  104.                                                 try {
  105.                                                         return createBean(beanName, mbd, args);
  106.                                                 } finally {
  107.                                                         afterPrototypeCreation(beanName);
  108.                                                 }
  109.                                         });
  110.                                         bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  111.                                 } catch (IllegalStateException ex) {
  112.                                         throw new BeanCreationException(
  113.                         beanName, "Scope is not active for the current thread", ex);
  114.                                 }
  115.                         }
  116.                 } catch (BeansException ex) {
  117.                         cleanupAfterBeanCreationFailure(beanName);
  118.                         throw ex;
  119.                 }
  120.         }
  121.         // 类型转换
  122.         if (requiredType != null && !requiredType.isInstance(bean)) {
  123.                 try {
  124.                         T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
  125.                         if (convertedBean == null) {
  126.                                 throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  127.                         }
  128.                         return convertedBean;
  129.                 } catch (TypeMismatchException ex) {
  130.                         throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
  131.                 }
  132.         }
  133.         return (T) bean;
  134. }
复制代码
创建/获取单例Bean
  1. sharedInstance = getSingleton(beanName, () -> {
  2.         try {
  3.                 return createBean(beanName, mbd, args);
  4.         } catch (BeansException ex) {
  5.                 // Explicitly remove instance from singleton cache: It might have been put there
  6.                 // eagerly by the creation process, to allow for circular reference resolution.
  7.                 // Also remove any beans that received a temporary reference to the bean.
  8.                 destroySingleton(beanName);
  9.                 throw ex;
  10.         }
  11. });
  12. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
复制代码
getSingleton

返回指定beanName的(原始)单例对象,如果没有则创建一个新对象:
  1. public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
  2.         synchronized (this.singletonObjects) {
  3.                 Object singletonObject = this.singletonObjects.get(beanName);
  4.                 if (singletonObject == null) {
  5.                         // Singleton bean creation not allowed while singletons of this factory are in destruction
  6.                         // (Do not request a bean from a BeanFactory in a destroy method implementation!)
  7.                         if (this.singletonsCurrentlyInDestruction) {
  8.                                 throw new BeanCreationNotAllowedException(beanName, "");
  9.                         }
  10.                         beforeSingletonCreation(beanName);
  11.                         boolean newSingleton = false;
  12.                         boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
  13.                         if (recordSuppressedExceptions) {
  14.                                 this.suppressedExceptions = new LinkedHashSet<>();
  15.                         }
  16.                         try {
  17.                                 // 此处需要返回去看createBean(beanName, mbd, args)的代码
  18.                                 singletonObject = singletonFactory.getObject();
  19.                                 newSingleton = true;
  20.                         } catch (IllegalStateException ex) {
  21.                                 // Has the singleton object implicitly appeared in the meantime ->
  22.                                 // if yes, proceed with it since the exception indicates that state.
  23.                                 singletonObject = this.singletonObjects.get(beanName);
  24.                                 if (singletonObject == null) {
  25.                                         throw ex;
  26.                                 }
  27.                         } catch (BeanCreationException ex) {
  28.                                 if (recordSuppressedExceptions) {
  29.                                         for (Exception suppressedException : this.suppressedExceptions) {
  30.                                                 ex.addRelatedCause(suppressedException);
  31.                                         }
  32.                                 }
  33.                                 throw ex;
  34.                         } finally {
  35.                                 if (recordSuppressedExceptions) {
  36.                                         this.suppressedExceptions = null;
  37.                                 }
  38.                                 afterSingletonCreation(beanName);
  39.                         }
  40.                         if (newSingleton) {
  41.                                 // 将创建的单例放入单例池
  42.                                 addSingleton(beanName, singletonObject);
  43.                         }
  44.                 }
  45.                 return singletonObject;
  46.         }
  47. }
  48. protected void addSingleton(String beanName, Object singletonObject) {
  49.         synchronized (this.singletonObjects) {
  50.                 this.singletonObjects.put(beanName, singletonObject);
  51.                 this.singletonFactories.remove(beanName);
  52.                 this.earlySingletonObjects.remove(beanName);
  53.                 this.registeredSingletons.add(beanName);
  54.         }
  55. }
复制代码
createBean

创建Bean实例、填充属性、调用后置处理器等:
  1. protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)
  2.                 throws BeanCreationException {
  3.         RootBeanDefinition mbdToUse = mbd;
  4.         // Make sure bean class is actually resolved at this point, and
  5.         // clone the bean definition in case of a dynamically resolved Class
  6.         // which cannot be stored in the shared merged bean definition.
  7.         Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
  8.         if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
  9.                 mbdToUse = new RootBeanDefinition(mbd);
  10.                 mbdToUse.setBeanClass(resolvedClass);
  11.         }
  12.         // Prepare method overrides.
  13.         try {
  14.                 mbdToUse.prepareMethodOverrides();
  15.         } catch (BeanDefinitionValidationException ex) {
  16.                 throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
  17.                                 beanName, "Validation of method overrides failed", ex);
  18.         }
  19.         try {
  20.                 // 调用BeanPostProcessor处理器
  21.                 // 调用postProcessBeforeInstantiation方法
  22.                 Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
  23.                 // 如果后置处理器返回了Bean实例则直接返回
  24.                 if (bean != null) {
  25.                         return bean;
  26.                 }
  27.         } catch (Throwable ex) {
  28.                 throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
  29.                                 "BeanPostProcessor before instantiation of bean failed", ex);
  30.         }
  31.         try {
  32.                 Object beanInstance = doCreateBean(beanName, mbdToUse, args);
  33.                 return beanInstance;
  34.         } catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
  35.                 // A previously detected exception with proper bean creation context already,
  36.                 // or illegal singleton state to be communicated up to DefaultSingletonBeanRegistry.
  37.                 throw ex;
  38.         } catch (Throwable ex) {
  39.                 throw new BeanCreationException(
  40.                                 mbdToUse.getResourceDescription(), beanName,
  41.                                 "Unexpected exception during bean creation", ex);
  42.         }
  43. }
  44. protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
  45.                 throws BeanCreationException {
  46.         // Instantiate the bean.
  47.         BeanWrapper instanceWrapper = null;
  48.         if (mbd.isSingleton()) {
  49.                 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  50.         }
  51.         if (instanceWrapper == null) {
  52.                 // 创建实例,使用BeanWrapper包装
  53.                 // 构造方法的@Autowired也在这里面实现
  54.                 instanceWrapper = createBeanInstance(beanName, mbd, args);
  55.         }
  56.         Object bean = instanceWrapper.getWrappedInstance();
  57.         Class<?> beanType = instanceWrapper.getWrappedClass();
  58.         if (beanType != NullBean.class) {
  59.                 mbd.resolvedTargetType = beanType;
  60.         }
  61.         // Allow post-processors to modify the merged bean definition.
  62.         synchronized (mbd.postProcessingLock) {
  63.                 if (!mbd.postProcessed) {
  64.                         try {
  65.                                 // 调用MergedBeanDefinitionPostProcessor处理器
  66.                                 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
  67.                         } catch (Throwable ex) {
  68.                                 throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  69.                                                 "Post-processing of merged bean definition failed", ex);
  70.                         }
  71.                         mbd.postProcessed = true;
  72.                 }
  73.         }
  74.         // 这里使用三级缓存封装了一段代码,解决循环依赖问题
  75.         // 这段代码会执行SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference方法
  76.         // 依赖这个Bean的其他Bean在填充属性时,调用getSingleton时会执行getEarlyBeanReference方法
  77.         // 此时可以对这个Bean实例做一些事情,比如创建AOP代理
  78.         // 之后会将修改之后的对象放入到二级缓存
  79.         boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
  80.                         isSingletonCurrentlyInCreation(beanName));
  81.         if (earlySingletonExposure) {
  82.                 addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
  83.         }
  84.         // Initialize the bean instance.
  85.         Object exposedObject = bean;
  86.         try {
  87.                 // Populate the bean instance in the given BeanWrapper
  88.                 // with the property values from the bean definition.
  89.                 // 1. 调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法
  90.                 // 2. 依赖注入
  91.                 populateBean(beanName, mbd, instanceWrapper);
  92.                 // Initialize the given bean instance, applying factory
  93.                 // callbacks as well as init methods and bean post processors.
  94.                 // 1. invokeAwareMethods
  95.                 // 2. 调用BeanPostProcessor的postProcessBeforeInitialization
  96.                 // 3. InitializingBean的afterPropertiesSet和initMethod
  97.                 // 4. 调用BeanPostProcessor的postProcessAfterInitialization
  98.                 exposedObject = initializeBean(beanName, exposedObject, mbd);
  99.         } catch (Throwable ex) {
  100.                 if (ex instanceof BeanCreationException &&
  101.             beanName.equals(((BeanCreationException) ex).getBeanName())) {
  102.                         throw (BeanCreationException) ex;
  103.                 } else {
  104.                         throw new BeanCreationException(
  105.                                         mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
  106.                 }
  107.         }
  108.         if (earlySingletonExposure) {
  109.                 // 获取提前暴露的Bean实例
  110.                 Object earlySingletonReference = getSingleton(beanName, false);
  111.                 if (earlySingletonReference != null) {
  112.                         if (exposedObject == bean) {
  113.                                 // 使用提前暴露的Bean替换当前Bean
  114.                                 exposedObject = earlySingletonReference;
  115.                         } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
  116.                                 String[] dependentBeans = getDependentBeans(beanName);
  117.                                 Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
  118.                                 for (String dependentBean : dependentBeans) {
  119.                                         if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
  120.                                                 actualDependentBeans.add(dependentBean);
  121.                                         }
  122.                                 }
  123.                                 if (!actualDependentBeans.isEmpty()) {
  124.                                         throw new BeanCurrentlyInCreationException(beanName, "");
  125.                                 }
  126.                         }
  127.                 }
  128.         }
  129.         // Register bean as disposable.
  130.         try {
  131.                 registerDisposableBeanIfNecessary(beanName, bean, mbd);
  132.         } catch (BeanDefinitionValidationException ex) {
  133.                 throw new BeanCreationException(
  134.                                 mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
  135.         }
  136.         return exposedObject;
  137. }
复制代码
创建Prototype类型的Bean
  1. // It's a prototype -> create a new instance.
  2. Object prototypeInstance = null;
  3. try {
  4.         // 把beanName注册到ThreadLocal prototypesCurrentlyInCreation中
  5.         beforePrototypeCreation(beanName);
  6.         // 这里的逻辑与singleton一样了
  7.         prototypeInstance = createBean(beanName, mbd, args);
  8. } finally {
  9.         // 把beanName从ThreadLocal prototypesCurrentlyInCreation清除
  10.         afterPrototypeCreation(beanName);
  11. }
  12. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4