23°

Spring中bean的实例化过程

1.从缓存中。优先从一级缓存中拿,有则返回。 如果没有,则从二级缓存中获取,有则返回。 如果二级缓存中拿不到,则从三级缓存中拿,能拿到,则从三级缓存中删除,移到二级缓存。

如果三级缓存也没有,则返回null.

2. 如果是单例模式, 则走createBean 的流程,进行bean对象的实例化。

  2.1 获取到该beanDefinition对应的字节码对象。

 2.2 prepareMethodOverrides。 检查beanDefinition对象的每一个methodOverride的对象。如果该对象对应的同名的方法只有一个则设置为false, 默认设置为true.

 2.3 调用doCreateBean 方法,进行具体的实例化过程。

3. 

 3.1 如果是单例的,则从bean工厂的实例缓存中获取bean对象。

if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
3.2 如果获取到的为空, 则进行bean对象的实例化创建。调用createBeanInstance
if (instanceWrapper == null) {
//创建实例,,重点看,重要程度:5
instanceWrapper = createBeanInstance(beanName, mbd, args);
}

3.3如果有FactoryMethodName属性,则通过factorymethod 方法进行对象的实例化。
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}

3.4 否则,
寻找当前正在实例化的bean中有@Autowired注解的构造函数
// 调用SmartInstantiationAwareBeanPostProcessor类型的beanpostProcess.determineCandidateConstructors 获取有autowired和value注解的构造器。
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

3.5
//如果ctors不为空,就说明构造函数上有@Autowired注解, 则通过构造函数进行初始化。
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
//如果ctors不为空,就说明构造函数上有@Autowired注解
return autowireConstructor(beanName, mbd, ctors, args);
}

3.6 如果首选的构造器不为空, 则使用首选的构造器进行实例化,以及进行以来注入
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}

3.7 否则调用无参构造函数进行bean的实例化。
//无参构造函数的实例化,大部分的实例是采用的无参构造函数的方式实例化,并包装成一个BeanWrapper 对象进行返回。
return instantiateBean(beanName, mbd);

4. 调用applyMergedBeanDefinitionPostProcessors。主要是对实现了MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition方法调用。
主要的实现类有:

4.1 AutowiredAnnotationBeanPostProcessor。在postProcessMergedBeanDefinition方法中实现对Autowired,Value注解的注解信息收集,封装到externallyManagedConfigMembers。
    4.2  CommonAnnotationBeanPostProcessor。 在postProcessMergedBeanDefinition方法中实现对@PostConstrutor 和 @ PreDestory ,@Resource 注解的信息收集,封装到externallyManagedConfigMembers。
5. 检查是否允许循环依赖,以及是否是单例模式。满足条件的话,从二级缓存中移除,并且添加到三级缓存中。
6.进行属性的注入,调用populateBean 方法。
6.1 根据注入的模式,进行对应属性的字段,filed ,以及method依赖的解析。获取其依赖的对象的值。
6.2 调用实现了InstantiationAwareBeanPostProcessor接口的postProcessProperties 方法,对有autowired,value,resource 注解的属性实现属性值的注入。
AutowiredAnnotationBeanPostProcessor中实现对autowired,value 属性的注入。
在CommonAnnotationBeanPostProcessor中实现对resource 属性的注入。
6.3 调用applyPropertyValues 方法,实现对<property/> 标签的属性值的解析。

7.调用bean的
initializeBean方法,完成bean 实例化过程的后续操作。

7.1 调用invokeAwareMethods 方法。根据是否实现了 一系列的aware 接口,调用其对应的方法
7.2 调用BeanPostProcessor接口的postProcessBeforeInitialization方法。进行bean初始化的前期方法调用。对 initmethod,,afterpeoperties, postcontructor 方法调用。

  1.InitDestroyAnnotationBeanPostProcessor中实现对@PostContrustor注解标识的方法进行调用

                2.调用实现了InitializingBean 接口的afterpropertiesSet 方法。
                3.调用指定了init-method属性的方法。

     7.3  调用applyBeanPostProcessorsAfterInitialization方法,实现对BeanPostProcessor的postProcessAfterInitialization的方法的调用(TODO 这一个涉及到AOP的实现。后续完善。)

  

8.调用 registerDisposableBeanIfNecessary 方法。实现spring容器销毁时,bean 对象销毁是的操作注册。










 
 

本文转载自博客园,原文链接:https://www.cnblogs.com/cheng21553516/p/12199431.html

全部评论: 0

    我有话说: