方法执行流程
- 判断可以访问
- 通过 Supplier<?> 创建对象
- 通过工厂方法创建对象
- 使用合适的构造函数创建对象
- 使用无参构造函数创建对象
方法完整内容
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {// Make sure bean class is actually resolved at this point.// 得到对应的Class对象Class<?> beanClass = resolveBeanClass(mbd, beanName);// 判断Class对象;访问修饰符;nonPublicAccessAllowed默认为trueif (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);}// 一个类可能有多个构造器,Spring根据参数个数、类型确定需要调用的构造器// Shortcut when re-creating the same bean...// 标记防止重复创建boolean resolved = false;// 是否需要自动装配boolean autowireNecessary = false;// 如果没有参数if (args == null) {synchronized (mbd.constructorArgumentLock) {// 已经缓存的构造方法或者工厂方法(Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,// 避免再次创建相同bean时再次解析)if (mbd.resolvedConstructorOrFactoryMethod != null) {resolved = true;autowireNecessary = mbd.constructorArgumentsResolved;}}}// 有构造参数或者工厂方法if (resolved) {if (autowireNecessary) {// 构造器有参数,构造函数自动注入return autowireConstructor(beanName, mbd, null, null);} else {// 默认构造函数return instantiateBean(beanName, mbd);}}// Candidate constructors for autowiring?// 从bean后置处理器中为自动装配寻找构造方法Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {return autowireConstructor(beanName, mbd, ctors, args);}// Preferred constructors for default construction?// 找出最合适的默认构造方法ctors = mbd.getPreferredConstructors();if (ctors != null) {// 构造函数自动注入return autowireConstructor(beanName, mbd, ctors, null);}// No special handling: simply use no-arg constructor.// 使用默认无参构造函数创建对象return instantiateBean(beanName, mbd);}
