spring ioc容器创建与bean初始化源码解析5:初始化所有剩余未初始化的单实例bean及最终完成容器创建

1. beanFactory容器的创建及初始化

参考:spring ioc容器创建与bean初始化源码解析1:beanFactory容器的创建及初始化

2. 在beanFactory容器初始化之后定制和修改BeanFactory内容

参考:spring ioc容器创建与bean初始化源码解析2:在beanFactory容器初始化之后定制和修改BeanFactory内容

3. 注册BeanPostProcessor(作用在bean创建的过程中进行拦截,从而执行指定逻辑)

参考:spring ioc容器创建与bean初始化源码解析3:注册BeanPostProcessor(作用在bean创建的过程中进行拦截,从而执行指定逻辑)

4. 初始化MessageSource ApplicationEventMulticaster ApplicationListener

参考:spring ioc容器创建与bean初始化源码解析4:初始化MessageSource ApplicationEventMulticaster ApplicationListener

5. 初始化所有剩余未初始化的单实例bean及最终完成容器创建

参考:spring ioc容器创建与bean初始化源码解析5:初始化所有剩余未初始化的单实例bean及最终完成容器创建

6. spring ioc容器创建与bean初始化源码解析总结

参考:spring ioc容器创建与bean初始化源码解析总结

以下是第五篇

 

11. finishBeanFactoryInitialization(beanFactory);

初始化所有剩下的(因为之前的BeanPostProcessor Bean可能已经在前面初始化了)单实例bean;

// Instantiate all remaining (non-lazy-init) singletons.

finishBeanFactoryInitialization(beanFactory);

 

11.1 beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean

最主要的方法:

// Instantiate all remaining (non-lazy-init) singletons.

beanFactory.preInstantiateSingletons();

 

11.1 获取容器中的所有Bean,依次进行初始化和创建对象

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

可能其中有些bean已经在前面创建好单例对象了

迭代一个副本,通过init方法,来注册新的bean definition

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

for (String beanName : beanNames) {

11.2 获取Bean的定义信息;RootBeanDefinition

RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

 

11.3 Bean不是抽象的,是单实例的,不是懒加载;

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

11.3.1 判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;

if (isFactoryBean(beanName)) {
return (beanInstance instanceof FactoryBean);

 

11.3.2 不是工厂Bean。利用getBean(beanName);创建对象

getBean(beanName);

11.3.2.1 getBean(beanName); ioc.getBean();

11.3.2.2 doGetBean(name, null, null, false);

11.3.2.3 先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)

从private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);获取的

可以看到现在是17个bean

之后我们会添加一个beanName为blue的对象,后面会看到有18个bean

11.3.2.4 缓存中获取不到,开始Bean的创建对象流程;

// Check if bean definition exists in this factory.

BeanFactory parentBeanFactory = getParentBeanFactory();

特别是当springmvc与spring整合之后,就存在一些父子容器

 

11.3.2.5 标记当前bean已经被创建

markBeanAsCreated(beanName);

这样,当两个线程都要创建某个bean的时候,可以保证其单例

/**

 * Mark the specified bean as already created (or about to be created).

 * <p>This allows the bean factory to optimize its caching for repeated

 * creation of the specified bean.

 * @param beanName the name of the bean

 */

protected void markBeanAsCreated(String beanName) {

   if (!this.alreadyCreated.contains(beanName)) {

      synchronized (this.mergedBeanDefinitions) {

         if (!this.alreadyCreated.contains(beanName)) {

            // Let the bean definition get re-merged now that we're actually creating

            // the bean... just in case some of its metadata changed in the meantime.

            clearMergedBeanDefinition(beanName);

            this.alreadyCreated.add(beanName);

         }

      }

   }

}

 

11.3.2.6 获取Bean的定义信息;

final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

 

11.3.2.7 获取当前Bean依赖的其他Bean;如果有按照getBean()把依赖的Bean先创建出来

// Guarantee initialization of beans that the current bean depends on.

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

   }

}

通过getBean(dep)来创建

11.3.2.8 启动单实例Bean的创建流程;

通过ObjectFactory的getObject来创建

// Create bean instance.

if (mbd.isSingleton()) {

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

      @Override

      public Object getObject() throws BeansException {

         try {

            return createBean(beanName, mbd, args);

         }

11.3.2.8.1 createBean(beanName, mbd, args);

 

11.3.2.8.2 Object bean = resolveBeforeInstantiation(beanName, mbdToUse);让BeanPostProcessor先拦截返回代理对象;

这块之前在spring AOP分析的时候分析过,如果有前面注册了的BeanPostProcessor是InstantiationAwareBeanPostProcessor的接口实现:那么这里会提前执行;

先触发:postProcessBeforeInstantiation();

如果有返回值:再触发postProcessAfterInitialization();

11.3.2.8.3 如果前面的InstantiationAwareBeanPostProcessor没有返回代理对象;调用下面11.3.2.8.4

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

 

11.3.2.8.4实际上创建指定的bean。

此时BeanPostProcessor的预创建处理已经执行完了,例如 检查postProcessBeforeInstantiation的回调。

 

11.3.2.8.4.1 创建Bean实例

instanceWrapper = createBeanInstance(beanName, mbd, args);

使用适当的实例化策略为指定的bean创建新实例:工厂方法,构造函数自动装配或简单实例化。

 

Bean一定要是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());

}

 

if (mbd.getFactoryMethodName() != null)  {

   return instantiateUsingFactoryMethod(beanName, mbd, args);

}

通过工厂方法来初始化bean

protected BeanWrapper instantiateUsingFactoryMethod(

      String beanName, RootBeanDefinition mbd, Object[] explicitArgs) {



   return new ConstructorResolver(this).instantiateUsingFactoryMethod(beanName, mbd, explicitArgs);

}

 

如果factory method不存在,那么就使用下面的方法来创建bean

if (resolved) {

   if (autowireNecessary) {

      return autowireConstructor(beanName, mbd, null, null);

   }

   else {

      return instantiateBean(beanName, mbd);

   }

}

autowire constructor(带有类型的构造函数参数),可以将构造函数中的参数注入

如果没有,就使用默认构造器

// Need to determine the constructor...
// No special handling: simply use no-arg constructor.

 

11.3.2.8.4.2 applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

// Allow post-processors to modify the merged bean definition.

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;

   }

}

调用MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName);

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors

11.3.2.8.4.3 初始化bean实例

使用bean定义中的属性值填充给定BeanWrapper中的bean实例。

// Initialize the bean instance.

Object exposedObject = bean;

try {

   populateBean(beanName, mbd, instanceWrapper);

   if (exposedObject != null) {

      exposedObject = initializeBean(beanName, exposedObject, mbd);

   }

}

 

赋值之前:

 

11.3.2.8.4.3.1 拿到InstantiationAwareBeanPostProcessor后置处理器;


 

if (bp instanceof InstantiationAwareBeanPostProcessor) {

   InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

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

      continueWithPropertyPopulation = false;

      break;

   }

}

执行postProcessAfterInstantiation()方法

 

11.3.2.8.4.3.2 再次拿到InstantiationAwareBeanPostProcessor后置处理器;

if (bp instanceof InstantiationAwareBeanPostProcessor) {

   InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

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

   if (pvs == null) {

      return;

   }

}

执行postProcessPropertyValues()方法

 

以上都是赋值之前

 

之后进行赋值

11.3.2.8.4.3.3 应用Bean属性的值;为属性利用setter方法等进行赋值;

applyPropertyValues(beanName, mbd, bw, pvs);

11.3.2.8.4.3.4 初始化bean

initializeBean(beanName, exposedObject, mbd);

if (exposedObject != null) {

   exposedObject = initializeBean(beanName, exposedObject, mbd);

}

 

11.3.2.8.4.3.4.1 执行Aware接口方法

invokeAwareMethods(beanName, bean);

 

private void invokeAwareMethods(final String beanName, final Object bean) {

   if (bean instanceof Aware) {

      if (bean instanceof BeanNameAware) {

         ((BeanNameAware) bean).setBeanName(beanName);

      }

      if (bean instanceof BeanClassLoaderAware) {

         ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());

      }

      if (bean instanceof BeanFactoryAware) {

         ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);

      }

   }

}

判断是否实现了BeanNameAware  BeanClassLoaderAware  BeanFactoryAware

 

11.3.2.8.4.3.4.2 执行后置处理器初始化之前

wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

 

11.3.2.8.4.3.4.3

【执行初始化方法】invokeInitMethods(beanName, wrappedBean, mbd);

 

invokeInitMethods(beanName, wrappedBean, mbd);

通过check这个bean是否实现了InitializingBean或定义了custom init method,来给bean设置所有的属性

 

11.3.2.8.4.3.4.3.1 是否是InitializingBean接口的实现;执行接口规定的初始化;

boolean isInitializingBean = (bean instanceof InitializingBean);

 

11.3.2.8.4.3.4.3.2 是否自定义初始化方法;

invokeCustomInitMethod(beanName, bean, mbd);

 

11.3.2.8.4.3.4.4 执行后置处理器初始化之后


wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

applyBeanPostProcessorsAfterInitialization

BeanPostProcessor.postProcessAfterInitialization();

 

11.3.2.8.4.3.4.5 注册Bean的销毁方法;

// Register bean as disposable.

try {

   registerDisposableBeanIfNecessary(beanName, bean, mbd);

}

 

11.3.2.8.4.3.5 将创建的Bean添加到缓存中singletonObjects;

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

 

/** Cache of singleton objects: bean name --> bean instance */

private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);

 

if (newSingleton) {

   addSingleton(beanName, singletonObject);

}

将给定的singleton对象添加到此工厂的singleton缓存中

protected void addSingleton(String beanName, Object singletonObject) {

   synchronized (this.singletonObjects) {

      this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));

      this.singletonFactories.remove(beanName);

      this.earlySingletonObjects.remove(beanName);

      this.registeredSingletons.add(beanName);

   }

}

可以看到,添加了一个名为blue的Bean

 

ioc容器就是这些Map;很多的Map里面保存了单实例Bean,环境信息....

 

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

获取给定bean实例的对象,或者是bean instance自身,如果是FactoryBean,那就是此factoryBean创建的object

// Now we have the bean instance, which may be a normal bean or a FactoryBean.

// If it's a FactoryBean, we use it to create a bean instance, unless the

// caller actually wants a reference to the factory.

if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {

   return beanInstance;

}

所有Bean都利用getBean创建完成以后;

 

org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons

对于所有的applicable bean,触发器post-initialization callback

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

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

      }

   }

}

检查所有的Bean是否是SmartInitializingSingleton接口的;如果是;就执行afterSingletonsInstantiated();

 

12. finishRefresh();

完成BeanFactory的初始化创建工作;IOC容器就创建完成;


// Last step: publish corresponding event.

finishRefresh();

 

12.1 initLifecycleProcessor();

初始化和生命周期有关的后置处理器;LifecycleProcessor

public static final String LIFECYCLE_PROCESSOR_BEAN_NAME = "lifecycleProcessor";

默认从容器中找是否有lifecycleProcessor的组件【LifecycleProcessor】;如果没有new DefaultLifecycleProcessor();

加入到容器;

                           

写一个LifecycleProcessor的实现类,可以在LifecycleProcessor(其是一个BeanFactory)

void onRefresh();

void onClose();

中进行一些动作

 

12.2 getLifecycleProcessor().onRefresh();

拿到前面定义的生命周期处理器LifecycleProcessor(BeanFactory);回调onRefresh();

12.3 publishEvent(new ContextRefreshedEvent(this));

发布容器刷新完成事件;

 

12.4 liveBeansView.registerApplicationContext(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值