1、创建BeanWrapper实例
bean对象实例化的第一步:创建BeanWrapper实例:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | BeanWrapper instanceWrapper = null;
 
 if (mbd.isSingleton()) {
 
 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
 }
 if (instanceWrapper == null) {
 
 instanceWrapper = createBeanInstance(beanName, mbd, args);
 }
 
 | 
BeanWrapper是Spring底层的核心接口,提供分析和操作标准javabean的操作:
获取和设置属性值(单独或批量)、获取属性描述符以及查询属性的可读性/可写性的能力。
首先,如果是单例模式的话,从缓存中获取instanceWrapper,
如果没有获取到,则通过工厂方法、构造函数自动装配或简单实例化策略来创建instanceWrapper。
1.1、createBeanInstance(beanName, mbd, args)
使用适当的实例化策略为指定的bean创建一个新实例:工厂方法、构造函数自动装配或简单实例化。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 
 | protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
 Class<?> beanClass = resolveBeanClass(mbd, beanName);
 
 
 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());
 }
 
 
 Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
 if (instanceSupplier != null) {
 
 return obtainFromSupplier(instanceSupplier, beanName);
 }
 
 
 if (mbd.getFactoryMethodName() != null) {
 
 return instantiateUsingFactoryMethod(beanName, mbd, args);
 }
 
 
 boolean resolved = false;
 boolean autowireNecessary = false;
 if (args == null) {
 
 synchronized (mbd.constructorArgumentLock) {
 
 
 
 if (mbd.resolvedConstructorOrFactoryMethod != null) {
 resolved = true;
 
 autowireNecessary = mbd.constructorArgumentsResolved;
 }
 }
 }
 
 if (resolved) {
 
 if (autowireNecessary) {
 return autowireConstructor(beanName, mbd, null, null);
 } else {
 
 return instantiateBean(beanName, mbd);
 }
 }
 
 
 
 
 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
 if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
 mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
 return autowireConstructor(beanName, mbd, ctors, args);
 }
 
 
 ctors = mbd.getPreferredConstructors();
 if (ctors != null) {
 return autowireConstructor(beanName, mbd, ctors, null);
 }
 
 
 return instantiateBean(beanName, mbd);
 }
 
 | 
主要的逻辑为:
- 如果存在Supplie 回调,则调用obtainFromSupplier()获取bean实例。
- 如果存在工厂方法,则使用工厂方法获取bean实例。
- 首先判断缓存,如果缓存中存在,即已经解析过了,则直接使用已经解析的。根据 constructorArgumentsResolved 参数来判断是使用构造函数自动注入还是默认构造函数。
- 如果缓存中没有,则需要先确定到底使用哪个构造函数来完成解析工作,
 因为一个类有多个构造函数,每个构造函数都有不同的构造参数,所以需要根据参数来锁定构造函数并完成初始化,如果存在参数则使用相应的带有参数的构造函数,否则使用默认构造函数。
即有四种获取bean实例的方法:
- obtainFromSupplier
- instantiateUsingFactoryMethod
- autowireConstructor
- instantiateBean
后面的文章分析这四种获取bean的实例方法。
