1、创建BeanWrapper实例
bean对象实例化的第一步:创建BeanWrapper实例:
1 2 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创建一个新实例:工厂方法、构造函数自动装配或简单实例化。
1 2 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的实例方法。