方法执行流程

    1. 判断可以访问
    2. 通过 Supplier<?> 创建对象
    3. 通过工厂方法创建对象
    4. 使用合适的构造函数创建对象
    5. 使用无参构造函数创建对象

    方法完整内容

    1. protected BeanWrapper createBeanInstance(String beanName
    2. , RootBeanDefinition mbd, @Nullable Object[] args) {
    3. // Make sure bean class is actually resolved at this point.
    4. // 得到对应的Class对象
    5. Class<?> beanClass = resolveBeanClass(mbd, beanName);
    6. // 判断Class对象;访问修饰符;nonPublicAccessAllowed默认为true
    7. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers())
    8. && !mbd.isNonPublicAccessAllowed()) {
    9. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    10. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    11. }
    12. // 通过给定的函数获取对象
    13. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    14. if (instanceSupplier != null) {
    15. return obtainFromSupplier(instanceSupplier, beanName);
    16. }
    17. // 工厂方法获取对象
    18. if (mbd.getFactoryMethodName() != null) {
    19. return instantiateUsingFactoryMethod(beanName, mbd, args);
    20. }
    21. // 一个类可能有多个构造器,Spring根据参数个数、类型确定需要调用的构造器
    22. // Shortcut when re-creating the same bean...
    23. // 标记防止重复创建
    24. boolean resolved = false;
    25. // 是否需要自动装配
    26. boolean autowireNecessary = false;
    27. // 如果没有参数
    28. if (args == null) {
    29. synchronized (mbd.constructorArgumentLock) {
    30. // 已经缓存的构造方法或者工厂方法(Spring会将解析过后确定下来的构造器或工厂方法保存在缓存中,
    31. // 避免再次创建相同bean时再次解析)
    32. if (mbd.resolvedConstructorOrFactoryMethod != null) {
    33. resolved = true;
    34. autowireNecessary = mbd.constructorArgumentsResolved;
    35. }
    36. }
    37. }
    38. // 有构造参数或者工厂方法
    39. if (resolved) {
    40. if (autowireNecessary) {
    41. // 构造器有参数,构造函数自动注入
    42. return autowireConstructor(beanName, mbd, null, null);
    43. } else {
    44. // 默认构造函数
    45. return instantiateBean(beanName, mbd);
    46. }
    47. }
    48. // Candidate constructors for autowiring?
    49. // 从bean后置处理器中为自动装配寻找构造方法
    50. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    51. if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
    52. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
    53. return autowireConstructor(beanName, mbd, ctors, args);
    54. }
    55. // Preferred constructors for default construction?
    56. // 找出最合适的默认构造方法
    57. ctors = mbd.getPreferredConstructors();
    58. if (ctors != null) {
    59. // 构造函数自动注入
    60. return autowireConstructor(beanName, mbd, ctors, null);
    61. }
    62. // No special handling: simply use no-arg constructor.
    63. // 使用默认无参构造函数创建对象
    64. return instantiateBean(beanName, mbd);
    65. }