10_finishBeanFactoryInitialization

finishBeanFactoryInitialization  的作用就是初始化剩余的所有单实例bean。除了一些需要提前初始化的类。比如前面实现了BeanDefinitionRegistryPostProcessor(在invokeBeanFactoryPostProcessors方法的时候)。通过beanFactory.getBean提前获取的。最后的都是在该方法中完成创建。

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {

                   //初始化ConversionService,这个service,主要是做类型转换

       //如DefaultConversionService

                   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));

                   }

 

                   // 注册一个默认的embed value resolver。

                   if (!beanFactory.hasEmbeddedValueResolver()) {

                            beanFactory.addEmbeddedValueResolver(new StringValueResolver() {

                                     @Override

                                     public String resolveStringValue(String strVal) {

                                               return getEnvironment().resolvePlaceholders(strVal);

                                     }

                            });

                   }

 

                   //注册默认的额loadtimeweaveraware

                   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();

 

                   //初始化所有剩余的bean

                   beanFactory.preInstantiateSingletons();

         }

进入DefaultListableBeanFactory的preInstantiateSingletons

public void preInstantiateSingletons() throws BeansException {

                   if (this.logger.isDebugEnabled()) {

                            this.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<String>(this.beanDefinitionNames);

 

                   // Trigger initialization of all non-lazy singleton beans...

                   for (String beanName : beanNames) {

           //获取缓存的BeanDefinition对象并合并其父类和本身的属性

                            RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

                            if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

                //判断是否是factoryBean,是否需要提前初始化

                //如果需要提前初始化,则进行初始化bean.调用getBean方法

                                     if (isFactoryBean(beanName)) {

                                               final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);

                                               boolean isEagerInit;

                                               if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {

                                                        isEagerInit = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {

                                                                 @Override

                                                                 public Boolean run() {

                                                                           return ((SmartFactoryBean<?>) factory).isEagerInit();

                                                                 }

                                                        }, getAccessControlContext());

                                               }

                                               else {

                                                        isEagerInit = (factory instanceof SmartFactoryBean &&

                                                                           ((SmartFactoryBean<?>) factory).isEagerInit());

                                               }

                                               if (isEagerInit) {

                                                        getBean(beanName);

                                               }

                                     }

                                     else {

                                               getBean(beanName);

                                     }

                            }

                   }

 

                   // Trigger post-initialization callback for all applicable beans...

        //初始化完成,对于所有的实现了SmartInitializingSingleton接口的bean调用

        //其afterSingletonsInstantiated

                   for (String beanName : beanNames) {

                            Object singletonInstance = getSingleton(beanName);

                            if (singletonInstance instanceof SmartInitializingSingleton) {

                                     final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;

                                     if (System.getSecurityManager() != null) {

                                               AccessController.doPrivileged(new PrivilegedAction<Object>() {

                                                        @Override

                                                        public Object run() {

                                                                 smartSingleton.afterSingletonsInstantiated();

                                                                 return null;

                                                        }

                                               }, getAccessControlContext());

                                     }

                                     else {

                                               smartSingleton.afterSingletonsInstantiated();

                                     }

                            }

                   }

         }

进入到AbstractBeanFactory的doGetBean

protected <T> T doGetBean(

                            final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)

                            throws BeansException {

        //得到bean的真实名称,如果是别名,则需要换成真实的bean的名称

                   final String beanName = transformedBeanName(name);

                   Object bean;

 

                   //检查缓存或者实例工厂中是否有当前的bean.

       //这一步的作用很关键。为了防止循环依赖。在bean创建完成之前

       //会提前暴露一个beanFactory。这样在依赖中如果有涉及到该bean的

      //会提前返回当前bean对应的ObjectFactory.

         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 + "'");

                                     }

                            }

            //返回对应的实例。比如返回beanFactory.getObject的真实对象

                            bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);

                   }

 

                   else {

            //scope为prototype的时候,无法进行循环依赖。所以抛出异常

                            if (isPrototypeCurrentlyInCreation(beanName)) {

                                     throw new BeanCurrentlyInCreationException(beanName);

                            }

 

                            //尝试从父bean中获取

                            BeanFactory parentBeanFactory = getParentBeanFactory();

                            if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {

                                     // Not found -> check parent.

                                     String nameToLookup = originalBeanName(name);

                                     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);

                                     }

                            }

            //如果不是仅仅做类型检查

           //记录该bean被创建

                            if (!typeCheckOnly) {

                                     markBeanAsCreated(beanName);

                            }

 

                            try {

                //转换以及合并父类的属性

                                     final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

                                     checkMergedBeanDefinition(mbd, beanName, args);

 

                                     //查看是否有dependOn属性

                //注册并且优先创建denpendOn的bean

                                     String[] dependsOn = mbd.getDependsOn();

                                     if (dependsOn != null) {

                                               for (String dep : dependsOn) {

                                                        if (isDependent(beanName, dep)) {

                                                                 throw new BeanCreationException(mbd.getResourceDescription(), beanName,

                                                                                    "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");

                                                        }

                                                        registerDependentBean(dep, beanName);

                                                        getBean(dep);

                                               }

                                     }

 

                                     // 创建单例bena

                                     if (mbd.isSingleton()) {

                    //在创建bean之前,先通过该bean进行创建一个ObjectFactory.

                    //然后调用createBean方法。

                                               sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {

                                                        @Override

                                                        public Object getObject() throws BeansException {

                                                                 try {

                                                                           return createBean(beanName, mbd, args);

                                                                 }

                                                                 catch (BeansException ex) {

                                                                           // Explicitly remove instance from singleton cache: It might have been put there

                                                                           // eagerly by the creation process, to allow for circular reference resolution.

                                                                           // Also remove any beans that received a temporary reference to the bean.

                                                                           destroySingleton(beanName);

                                                                           throw ex;

                                                                 }

                                                        }

                                               });

                     //获取最终的bean的实例。有些事FactoryBean.具体的要根据方法名比如,如果是&开头的,代表获取FactoryBean本身的实例,否则是getObject方法

                                               bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);

                                     }

                //创建prototype类型的bena

                                     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 = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);

                                     }

 

                                     else {

                                               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, new ObjectFactory<Object>() {

                                                                 @Override

                                                                 public Object getObject() throws BeansException {

                                                                           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;

                            }

                   }

 

                   //类型转换,如得到的bean可能是String型,但是需要的是Integer

       //这里就会自动转换

                   if (requiredType != null && bean != null && !requiredType.isInstance(bean)) {

                            try {

                                     return getTypeConverter().convertIfNecessary(bean, requiredType);

                            }

                            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;

         }

我们看一下创建单例中的getSingleton方法,里边有几个标志位需要讲解一下

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {

                   Assert.notNull(beanName, "'beanName' must not be null");

                   synchronized (this.singletonObjects) {

                            Object singletonObject = this.singletonObjects.get(beanName);

                            if (singletonObject == null) {

                                     if (this.singletonsCurrentlyInDestruction) {

                                               throw new BeanCreationNotAllowedException(beanName,

                                                                 "Singleton bean creation not allowed while singletons of this factory are in destruction " +

                                                                 "(Do not request a bean from a BeanFactory in a destroy method implementation!)");

                                     }

                                     if (logger.isDebugEnabled()) {

                                               logger.debug("Creating shared instance of singleton bean '" + beanName + "'");

                                     }

               // 将当前加入到singletonsCurrentlyInCreation中。后面会根据这个判断是//否需要返回一个ObjectFactory

                                     beforeSingletonCreation(beanName);

                                     boolean newSingleton = false;

                                     boolean recordSuppressedExceptions = (this.suppressedExceptions == null);

                                     if (recordSuppressedExceptions) {

                                               this.suppressedExceptions = new LinkedHashSet<Exception>();

                                     }

                                     try {

                                               singletonObject = singletonFactory.getObject();

                                               newSingleton = true;

                                     }

                                     catch (IllegalStateException ex) {

                                               // Has the singleton object implicitly appeared in the meantime ->

                                               // if yes, proceed with it since the exception indicates that state.

                                               singletonObject = this.singletonObjects.get(beanName);

                                               if (singletonObject == null) {

                                                        throw ex;

                                               }

                                     }

                                     catch (BeanCreationException ex) {

                                               if (recordSuppressedExceptions) {

                                                        for (Exception suppressedException : this.suppressedExceptions) {

                                                                 ex.addRelatedCause(suppressedException);

                                                        }

                                               }

                                               throw ex;

                                     }

                                     finally {

                                               if (recordSuppressedExceptions) {

                                                        this.suppressedExceptions = null;

                                               }

                    //移除状态,当前bean已经创建完成

                                               afterSingletonCreation(beanName);

                                     }

                                     if (newSingleton) {

                    //添加到已经已经注册的以及所有的单例map中

                    // singletonObjects, registeredSingletons

                                               addSingleton(beanName, singletonObject);

                                     }

                            }

                            return (singletonObject != NULL_OBJECT ? singletonObject : null);

                   }

         }

下面我们看一下具体的创建bean的实例过程。首先进入AbstractAutowireCapableBeanFactory的createBean方法中

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {

                   if (logger.isDebugEnabled()) {

                            logger.debug("Creating instance of bean '" + beanName + "'");

                   }

                   RootBeanDefinition mbdToUse = mbd;

 

                  //根据类名或者class解析类

                   Class<?> resolvedClass = resolveBeanClass(mbd, beanName);

                   if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {

                            mbdToUse = new RootBeanDefinition(mbd);

                            mbdToUse.setBeanClass(resolvedClass);

                   }

 

                   // Prepare method overrides.

                   try {

            //验证及准备重载的方法

            //lookup-method 以及replace-method

                            mbdToUse.prepareMethodOverrides();

                   }

                   catch (BeanDefinitionValidationException ex) {

                            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),

                                               beanName, "Validation of method overrides failed", ex);

                   }

 

                   try {

                            //通过InstantiationAwareBeanPostProcessor后置处理器,看是否需要

            //返回一个代理bean。如果有代理,直接返回。在里边会调用

            //postProcessAfterInitialization。确保所有的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);

                   }

        //具体的创建行为。

                   Object beanInstance = doCreateBean(beanName, mbdToUse, args);

                   if (logger.isDebugEnabled()) {

                            logger.debug("Finished creating instance of bean '" + beanName + "'");

                   }

                   return beanInstance;

         }

 

进入到AbstractAutowireCapableBeanFactory的doCreateBean方法中

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

                            throws BeanCreationException {

 

                   // Instantiate the bean.

                   BeanWrapper instanceWrapper = null;

                   if (mbd.isSingleton()) {

                            instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);

                   }

       //创建bean的实例。这一过程会通过调用SmartInstantiationAwareBeanPostProcessor

       //的determineCandidateConstructors。查看是否提供构造函数

                   if (instanceWrapper == null) {

                            instanceWrapper = createBeanInstance(beanName, mbd, args);

                   }

                   final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);

                   Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);

                   mbd.resolvedTargetType = beanType;

 

                       //通过调用MergedBeanDefinitionPostProcessor的//postProcessMergedBeanDefinition方法.一般都会在该方法提前进行解析一些配//置,然后放入到对应的缓存中,如AutowiredAnnotationBeanPostProcessor的//postProcessMergedBeanDefinition.会提前加载是否有需要自动注入的Autowired

         //@Value注解,提前解析

                   synchronized (mbd.postProcessingLock) {

                            if (!mbd.postProcessed) {

                                     try {

                                               applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

                                     }

                                     catch (Throwable ex) {

                                               throw new BeanCreationException(mbd.getResourceDescription(), beanName,

                                                                 "Post-processing of merged bean definition failed", ex);

                                     }

                                     mbd.postProcessed = true;

                            }

                   }

 

               //还记得上面我们说的为了解决循环依赖,会把当前的bean的ObjectFactory提前//暴露.下面这段代码实现。把当前的objectFactory放入singletonFactories中

                   boolean 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, new ObjectFactory<Object>() {

                                     @Override

                                     public Object getObject() throws BeansException {

                    //在此处会对bean进行增强处理,通过调用

                   //SmartInstantiationAwareBeanPostProcessor的getEarlyBeanReference

                   //aop在此进行动态织入advice

                                               return getEarlyBeanReference(beanName, mbd, bean);

                                     }

                            });

                   }

 

                   // Initialize the bean instance.

                   Object exposedObject = bean;

                   try {

            //填充属性。比如resource注解,autowired注解。

            //会在其中进行递归调用

                            populateBean(beanName, mbd, instanceWrapper);

                            if (exposedObject != null) {

                //初始化bean。

                                     exposedObject = 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<String>(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 {

                            registerDisposableBeanIfNecessary(beanName, bean, mbd);

                   }

                   catch (BeanDefinitionValidationException ex) {

                            throw new BeanCreationException(

                                               mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);

                   }

 

                   return exposedObject;

         }

下面进行解析属性填充方法populateBean

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {

                   PropertyValues pvs = mbd.getPropertyValues();

        //

                   if (bw == null) {

                            if (!pvs.isEmpty()) {

                                     throw new BeanCreationException(

                                                        mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");

                            }

                            else {

                                     // Skip property population phase for null instance.

                                     return;

                            }

                   }

 

            //通过调用后置处理器,来看当前的bean是否需要继续填充属性

                   boolean continueWithPropertyPopulation = true;

      

                   if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {

                            for (BeanPostProcessor bp : getBeanPostProcessors()) {

                                     if (bp instanceof InstantiationAwareBeanPostProcessor) {

                                               InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

                                               if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {

                                                        continueWithPropertyPopulation = false;

                                                        break;

                                               }

                                     }

                            }

                   }

        //如果后置处理器判断不需要,则直接返回

                   if (!continueWithPropertyPopulation) {

                            return;

                   }

 

                   if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME ||

                                     mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {

                            MutablePropertyValues newPvs = new MutablePropertyValues(pvs);

 

                            // 根据名称自动注入

                            if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) {

                                     autowireByName(beanName, mbd, bw, newPvs);

                            }

 

                            //根据类型注入

                            if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) {

                                     autowireByType(beanName, mbd, bw, newPvs);

                            }

 

                            pvs = newPvs;

                   }

 

                   boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();

                   boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);

       //调用后置处理器进行属性填充

      // InstantiationAwareBeanPostProcessor. postProcessPropertyValues

     //@Autowired,@ Inject 参见AutowiredAnnotationBeanPostProcessor

     //@Resource 参见CommonAnnotationBeanPostProcessor

                   if (hasInstAwareBpps || needsDepCheck) {

                            PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);

                            if (hasInstAwareBpps) {

                                     for (BeanPostProcessor bp : getBeanPostProcessors()) {

                                               if (bp instanceof InstantiationAwareBeanPostProcessor) {

                                                        InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

                                                        pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);

                                                        if (pvs == null) {

                                                                  return;

                                                        }

                                               }

                                     }

                            }

                            if (needsDepCheck) {

                                     checkDependencies(beanName, mbd, filteredPds, pvs);

                            }

                   }

        //将属性引用到bean中。

                   applyPropertyValues(beanName, mbd, bw, pvs);

         }

 

下面我们来看下bean的初始化,进入AbstractAutowireCapableBeanFactory的initializeBean

 

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {

        //

                   if (System.getSecurityManager() != null) {

                            AccessController.doPrivileged(new PrivilegedAction<Object>() {

                                     @Override

                                     public Object run() {

                                               invokeAwareMethods(beanName, bean);

                                               return null;

                                     }

                            }, getAccessControlContext());

                   }

                   else {

           //判断当前是否实现BeanNameAware,BeanClassLoaderAware,

           // BeanFactoryAware 接口。

                            invokeAwareMethods(beanName, bean);

                   }

         //调用后置处理器的postProcessBeforeInitialization

        //初始化通过@PostConstruct的解析在这一步

       //参见  InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInitialization

                   Object wrappedBean = bean;

                   if (mbd == null || !mbd.isSynthetic()) {

                            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

                   }

                   try {

           //执行自定义方法,包括执行实现Initialization接口的afterProperties。

           //以及在xml配置的init-method的解析

                            invokeInitMethods(beanName, wrappedBean, mbd);

                   }

                   catch (Throwable ex) {

                            throw new BeanCreationException(

                                               (mbd != null ? mbd.getResourceDescription() : null),

                                               beanName, "Invocation of init method failed", ex);

                   }

        //bean的后置处理执行

                   if (mbd == null || !mbd.isSynthetic()) {

                            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

                   }

                   return wrappedBean;

         }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值