Bean对象创建流程

调用流程:AbstractApplicationContext#refresh

=> AbstractApplicationContext#finishBeanFactoryInitialization

=> DefaultListableBeanFactory#preInstantiateSingletons

=> AbstractBeanFactory#getBean

=> AbstractBeanFactory#doGetBean

=> AbstractBeanFactory#createBean
创建Bean对象的方法入口: AbstractAutowireCapableBeanFactory#createBean

// AbstractBeanFactory#doGetBean
if (mbd.isSingleton()) {
    // 关键方法 createBean  getSingleton
    sharedInstance = this.getSingleton(beanName, () -> {
        try {
            return this.createBean(beanName, mbd, args);
        } catch (BeansException var5) {
            this.destroySingleton(beanName);
            throw var5;
        }
    });
    bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
} else if (mbd.isPrototype()) {
    var11 = null;

    Object prototypeInstance;
    try {
        this.beforePrototypeCreation(beanName);
        prototypeInstance = this.createBean(beanName, mbd, args);
    } finally {
        this.afterPrototypeCreation(beanName);
    }

    bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}

准备工作:

1、保证类以及加载完成了

2、处理lookup-method and replace-method(打上标识mo.setOverloaded(false);)

3、断定是否需要spring来管理这个类

4、创建Bean的关键方法(AbstractAutowireCapableBeanFactory#doCreateBean)

回调BeanPostProcessor(一)

第一次回调BeanPostProcessor(InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法),用来断定是否需要spring来管理这个类

// AbstractAutowireCapableBeanFactory#createBean
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

这里就会返回这个接口中 postProcessBeforeInstantiation 方法返回的对象,spring中默认返回的是null。表示spring会去维护这个类中的一些依赖关系,如果我们不需要spring来维护这些但是又希望将spring将这个类放入容器中,就可以通过这个方法,将我们需要放入spring的对象返回,这里会直接返回这个对象,结束这个bean的创建

// 方法是判断是否向bean工厂中添加了 InstantiationAwareBeanPostProcessor 类型的后置处理器
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
        Class targetType = determineTargetType(beanName, mbd);
        if (targetType != null) {
            // InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
            bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
            if (bean != null) {
                // 遍历所有的 BeanPostProcessor 执行它的 postProcessAfterInitialization方法
                bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
            }
        }
    }
}

关键方法AbstractAutowireCapableBeanFactory#doCreateBean

Object beanInstance = doCreateBean(beanName, mbdToUse, args);

doCreateBean的逻辑如下:

  • 检查是否存在与factoryBean的缓存中,
// AbstractAutowireCapableBeanFactory#doCreateBean
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  • 如果不在FactoryBean的缓存中,则创建bean
if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}
  • 创建Bean的核心方法
// AbstractAutowireCapableBeanFactory#createBeanInstance
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
    // 确保bd中的class已经被加载进来了
    Class beanClass = resolveBeanClass(mbd, beanName);
    // 检查类的访问权限
    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {throw xxx}
    if (mbd.getFactoryMethodName() != null) {
        // bd是否存在工厂方法,如果存在工厂方法直接通过工厂方法进行创建
        // 参考 @Bean标注的static方法,这个bean就设置了FactoryMethod
        // @Bean 标注的普通方法是设置了 UniqueFactoryMethod 这两者的区别??
        return instantiateUsingFactoryMethod(beanName, mbd, args);
    }
    // Shortcut when re-creating the same bean...
    // 创建一个快捷方式,当重新创建相同的bean时,比如创建prototype类型的bean时
    // 从这里可以知道(上一次创建时)是使用无参构造函数创建,还是使用有参构造函数创建bean实例对象
    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) {
            // 使用构造函数注入的方式实例化bean
            return autowireConstructor(beanName, mbd, null, null);
        } else {
            // 使用无参构造函数实例化bean
            return instantiateBean(beanName, mbd);
        }
    }
    // 未完...
}

回调BeanPostProcessor(二)

Spring是如何知道是使用无参还是有参的构造函数?这与BeanPostProcessor的第二次回调有关

// Candidate constructors for autowiring?
// 这里是 BeanPostProcessor 的第二次回调,主要是推断构造方法
Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

上面这一句的总体意思就是是否采用有参的构造函数进行注入
1、只存在无参的构造函数时,这里会返回一个null
2、只存在一个有参的构造函数时,这里会返回这个有参的构造函数
3、存在一个无参的构造函数和一个有参的构造函数 ,返回null
4、存在两个有参的构造函数,返回null
5、存在三个或者三个以上的构造方法,返回null

// AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors
protected Constructor[] determineConstructorsFromBeanPostProcessors(@Nullable Class beanClass, String beanName) throws BeansException {
    // 执行 AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors推断构造函数
    if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
        for (BeanPostProcessor bp : getBeanPostProcessors()) {
            if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
                SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
                Constructor[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
                if (ctors != null) {
                    return ctors;
                }
            }
        }
    }
    return null;
}

推断构造函数总结:

当只存在一个构造函数时:
(1)默认的无参构造函数,这里会返回null
(2)自己写了一个有参的构造函数时,这里会返回这个有参的构造函数
当存在两个构造函数时
(1)两个都是有参的构造函数,这里会返回null
(2)一个有参的构造函数,一个无参的构造函数,这里还是返回null
在第二种情况中,怎么才能返回两个构造函数呢?
存在无参的构造函数,存在primaryConstructor,并且无参的构造函数和 primaryConstructor 不相等
这里的 primaryConstructor 是针对Kotlin的类的,所以在JAVA中这里永远都会返回一个null
所以在JAVA中这里是不可能返回两个构造函数的
当存在三个或者三个以上的构造函数时
这里一律返回null

所以要么只存在一个无参的构造方法,要么只存在一个有参的构造方法

// AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors
// 1、记录Lookup注解的方法
// 获取类中的所有构造函数
rawCandidates = beanClass.getDeclaredConstructors();
// 遍历所有的构造函数
for (Constructor candidate : rawCandidates) {
    // isSynthetic方法判断如果是合成的构造函数就返回true(java自己生成的),自己写的构造函数会返回false
    if (!candidate.isSynthetic()) {
        nonSyntheticConstructors++;// 统计构造函数的个数
    }else if (primaryConstructor != null) {
        // 存在primaryConstructor,会跳出循环
        continue;
    }
    // 获取构造方法上的注解
    AnnotationAttributes ann = findAutowiredAnnotation(candidate);
    if (ann == null) {
        // 构造方法上没有注解
        // 如果这个beanClass是被CGlib进行代理的class类型,则获取父类的构造函数
        // 进而拿到父类构造函数上的注解
        Class userClass = ClassUtils.getUserClass(beanClass);
        if (userClass != beanClass) {
            Constructor superCtor =
                        userClass.getDeclaredConstructor(candidate.getParameterTypes());
            ann = findAutowiredAnnotation(superCtor);
        }
    }
    if (ann != null) {
        if (requiredConstructor != null) {
            throw new BeanCreationException(beanName,requiredConstructor);
        }
        boolean required = determineRequiredStatus(ann);
        if (required) {
            if (!candidates.isEmpty()) {
                throw new BeanCreationException(beanName,candidate);
            }
            requiredConstructor = candidate;
        }
        // 只有在构造方法存在注解的情况下向 candidates 集合中添加了构造方法
        candidates.add(candidate);
    }else if (candidate.getParameterCount() == 0) {
        // 没有参数的构造函数,表示为默认的构造函数
        defaultConstructor = candidate;
    }
}
if (!candidates.isEmpty()) {
    // Add default constructor to list of optional constructors, as fallback.
    if (requiredConstructor == null) {
        if (defaultConstructor != null) {
            candidates.add(defaultConstructor);
        }else if (candidates.size() == 1 && logger.isInfoEnabled()) {
            logger.info("Inconsistent constructor declaration on bean with name");
        }
    }
    candidateConstructors = candidates.toArray(new Constructor[0]);
}else if (rawCandidates.length == 1 && rawCandidates[0].getParameterCount() > 0) {
    // rawCandidates表示所有的构造函数,表示只有一个有参的构造函数
    candidateConstructors = new Constructor[] {rawCandidates[0]};
}else if (nonSyntheticConstructors == 2 && primaryConstructor != null &&
    defaultConstructor != null && !primaryConstructor.equals(defaultConstructor)) {
    // 有两个构造函数,必须存在 一个 primaryConstructor 和一个 defaultConstructor
    // 并且两者不相等
    candidateConstructors = new Constructor[] {primaryConstructor, defaultConstructor};
}else if (nonSyntheticConstructors == 1 && primaryConstructor != null) {
    // 有一个primaryConstructor,就返回这个primaryConstructor
    candidateConstructors = new Constructor[] {primaryConstructor};
}else {
    // 不满足上述条件的一律视为不存在合适的构造函数 返回一个空数组
    candidateConstructors = new Constructor[0];
}
this.candidateConstructorsCache.put(beanClass, candidateConstructors);
return (candidateConstructors.length > 0 ? candidateConstructors : null);

调用构造方法创建对象

以下四种情况只有存在一种,都会使用有参构造函数进行bean的实例化

1、存在且只有 有参的构造函数 比较绕
2、bd的装配模式设置为了构造方法装配模式
3、通过操作bd,给定了bd的构造方法的参数(mybatis中Mapper的生成,给定了Mapper构造函数的接口名称 => 通过构造函数去创建Mapper代理对象)
4、传入的args参数不为空,这里传入的参数是构造函数中对应的实参

// AbstractAutowireCapableBeanFactory#createBeanInstance
Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
// 调用构造函数
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
    mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
    // 通过有参的构造函数创建bean
    return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction? bd中的默认首选构造函数
// 在RootBeanDefinition中默认返回了null,表示默认使用无参的构造函数
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
    return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
// 使用无参的构造函数创建bean对象
return instantiateBean(beanName, mbd);

有参的构造函数调用

调用有参的构造函数ConstructorResolver#autowireConstructor

  • beanName bean对象的名称
  • mbd bean合并后的bd
  • chosenCtors 选中执行的构造函数
  • explicitArgs 使用bd中的构造函数参数
public BeanWrapper autowireConstructor(String beanName, RootBeanDefinition mbd,
            Constructor[] chosenCtors, Object[] explicitArgs) {
    BeanWrapperImpl bw = new BeanWrapperImpl();
    this.beanFactory.initBeanWrapper(bw);
    // 将要使用的构造函数
    Constructor constructorToUse = null;
    // 构造函数的形参列表
    ArgumentsHolder argsHolderToUse = null;
    // 构造函数的实际参数
    Object[] argsToUse = null;
    // explicitArgs 是传递过来的实际参数
    if (explicitArgs != null) {
        argsToUse = explicitArgs;
    }else {
        Object[] argsToResolve = null;
        synchronized (mbd.constructorArgumentLock) {
            // 首先从缓存中获取构造函数和实际参数
            constructorToUse = (Constructor) mbd.resolvedConstructorOrFactoryMethod;
            if (constructorToUse != null && mbd.constructorArgumentsResolved) {
                // Found a cached constructor...
                argsToUse = mbd.resolvedConstructorArguments;
                if (argsToUse == null) {
                    argsToResolve = mbd.preparedConstructorArguments;
                }
            }
        }
        if (argsToResolve != null) {
            // 缓存中存在才会在这里解析实参
            argsToUse = resolvePreparedArguments(beanName, mbd, bw, constructorToUse, argsToResolve, true);
        }
    }
    // 缓存中没有获取到或者没有实参,都会进入这个if
    if (constructorToUse == null || argsToUse == null) {
        // Take specified constructors, if any.
        Constructor[] candidates = chosenCtors;
        if (candidates == null) {
            Class beanClass = mbd.getBeanClass();
            candidates = (mbd.isNonPublicAccessAllowed() ? 
                          beanClass.getDeclaredConstructors() : 
                          beanClass.getConstructors());
        }
        // mbd中不存在构造函数参数,并且只有一个构造函数
        if (candidates.length == 1 && explicitArgs == null && !mbd.hasConstructorArgumentValues()) {
            Constructor uniqueCandidate = candidates[0];
            if (uniqueCandidate.getParameterCount() == 0) {
                // 直接调用这个构造函数,不需要去进行构造函数的匹配
                synchronized (mbd.constructorArgumentLock) {
                    mbd.resolvedConstructorOrFactoryMethod = uniqueCandidate;
                    mbd.constructorArgumentsResolved = true;
                    mbd.resolvedConstructorArguments = EMPTY_ARGS;
                }
                bw.setBeanInstance(instantiate(beanName, mbd, uniqueCandidate, EMPTY_ARGS));
                return bw;
            }
        }
        // 这里表示存在多个构造函数,需要进行构造函数的匹配
        // Need to resolve the constructor.一般是这样的 autowiring == true
        boolean autowiring = (chosenCtors != null ||
                              mbd.getResolvedAutowireMode() == AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR);
        ConstructorArgumentValues resolvedValues = null;
        // 最少的参数个数,是根据这个方法传入的实参确定
        // 如果传入的实参为null,使用 resolveConstructorArguments 方法来确定最少参数个数
        int minNrOfArgs;
        if (explicitArgs != null) {
            minNrOfArgs = explicitArgs.length;
        }else {
            ConstructorArgumentValues cargs = mbd.getConstructorArgumentValues();
            resolvedValues = new ConstructorArgumentValues();
            minNrOfArgs = resolveConstructorArguments(beanName, mbd, bw, cargs, resolvedValues);
        }
        /**
         * 对传入的构造函数集合进行排序
         * 安装访问权限由大到小,参数由多到少的顺序排序
         */
        AutowireUtils.sortConstructors(candidates);
        // 参数和构造方法的差异权重,越小代表越接近
        int minTypeDiffWeight = Integer.MAX_VALUE;
        Set> ambiguousConstructors = null;
        LinkedList causes = null;
        for (Constructor candidate : candidates) {
            // 拿到构造函数的参数类型数组 1、拿到形参个数 2、拿到新参类型数组
            Class[] paramTypes = candidate.getParameterTypes();
            // 这个判断满足了,说明已经找到了合适的构造方法
            // 因为构造方法按照新参个数进行排序了,如果当前的构造函数的形参个数小于使用参数的个数
            // 那么在向下寻找也只会找到更少形参的构造方法,所以在这里直接 break 了
            if (constructorToUse != null && argsToUse != null && argsToUse.length > paramTypes.length) {
                // Already found greedy constructor that can be satisfied ->
                // do not look any further, there are only less greedy constructors left.
                break;
            }
            // 构造函数的形参个数小于了最小要求的实参个数
            // 比如实参有2个参数,这里直接过滤掉1个参数的构造函数
            if (paramTypes.length < minNrOfArgs) {
                continue;
            }
            // 封装形参和实现的对应关系
            ArgumentsHolder argsHolder;
            if (resolvedValues != null) {
                try {
                    // 获取形参的名称
                    String[] paramNames = ConstructorPropertiesChecker.evaluate(candidate, paramTypes.length);
                    if (paramNames == null) {
                        ParameterNameDiscoverer pnd = this.beanFactory.getParameterNameDiscoverer();
                        if (pnd != null) {
                            paramNames = pnd.getParameterNames(candidate);
                        }
                    }
                    argsHolder = createArgumentArray(beanName, mbd, 
                                          resolvedValues, bw, 
                                          paramTypes, paramNames,                                                                   getUserDeclaredConstructor(candidate), 
                                          autowiring, candidates.length == 1);
                }catch (UnsatisfiedDependencyException ex) {
                    // Swallow and try next constructor.
                    if (causes == null) {
                        causes = new LinkedList<>();
                    }
                    causes.add(ex);
                    continue;
                }
            }else {
                // Explicit arguments given -> arguments length must match exactly.
                if (paramTypes.length != explicitArgs.length) {
                    continue;
                }
                argsHolder = new ArgumentsHolder(explicitArgs);
            }
            // 类型差异权重
            int typeDiffWeight = (mbd.isLenientConstructorResolution() ?
                                  argsHolder.getTypeDifferenceWeight(paramTypes) : argsHolder.getAssignabilityWeight(paramTypes));
            // Choose this constructor if it represents the closest match.
            // 找到最小差异的构造方法和参数
            if (typeDiffWeight < minTypeDiffWeight) {
                constructorToUse = candidate;
                argsHolderToUse = argsHolder;
                argsToUse = argsHolder.arguments;
                minTypeDiffWeight = typeDiffWeight;
                ambiguousConstructors = null;
            } else if (constructorToUse != null && typeDiffWeight == minTypeDiffWeight) {
                if (ambiguousConstructors == null) {
                    ambiguousConstructors = new LinkedHashSet<>();
                    ambiguousConstructors.add(constructorToUse);
                }
                ambiguousConstructors.add(candidate);
            }
        }
        // 缓存构造函数和解析出来的参数
        if (explicitArgs == null && argsHolderToUse != null) {
            argsHolderToUse.storeCache(mbd, constructorToUse);
        }
    }
    Assert.state(argsToUse != null, "Unresolved constructor arguments");
    // 调用构造函数、实际参数创建对象
    bw.setBeanInstance(instantiate(beanName, mbd, constructorToUse, argsToUse));
    return bw;
}

最终调用SimpleInstantiationStrategy#instantiate判断如何进行实例化

  • 如果不存在方法的复写(lookup-method / replace-method )那么使用反射创建对象
  • 如果存在方法的复写,使用cglib进行实例化
// 反射调用构造方法
BeanUtils.instantiateClass(constructorToUse);
// 使用cglib
CglibSubclassingInstantiationStrategy#instantiateWithMethodInjection
// 最终返回
return new CglibSubclassCreator(bd, owner).instantiate(ctor, args);
// CglibSubclassingInstantiationStrategy.CglibSubclassCreator#instantiate
public Object instantiate(@Nullable Constructor ctor, Object... args) {
    Class subclass = createEnhancedSubclass(this.beanDefinition);
    Object instance;
    // ctor如果是null表示使用默认的无参构造函数,这里是和下面调用无参构造函数共用
    if (ctor == null) {
        instance = BeanUtils.instantiateClass(subclass);
    }else {
        Constructor enhancedSubclassConstructor = subclass.getConstructor(ctor.getParameterTypes());
        instance = enhancedSubclassConstructor.newInstance(args);
    }
    // enhanced class (via the Enhancer) in order to avoid memory leaks.
    Factory factory = (Factory) instance;
    // 设置方法的拦截器
    factory.setCallbacks(new Callback[] {NoOp.INSTANCE,
                                         new LookupOverrideMethodInterceptor(this.beanDefinition, this.owner),
                                         new ReplaceOverrideMethodInterceptor(this.beanDefinition, this.owner)});
    return instance;
}

LookupOverrideMethodInterceptor:拦截@Lookup/lookup-method注解的方法(LookupOverride)

ReplaceOverrideMethodInterceptor:拦截配置的replace-method的方法(ReplaceOverride)

LookupOverrideMethodInterceptor中的intercept会从容器中取出这个Lookup方法返回值类型的bean

public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) {
    // Cast is safe, as CallbackFilter filters are used selectively.
    LookupOverride lo = (LookupOverride) getBeanDefinition().getMethodOverrides().getOverride(method);
    Object[] argsToUse = (args.length > 0 ? args : null); 
    if (StringUtils.hasText(lo.getBeanName())) {
        // owner=BeanFactory  从容器中获取
        return (argsToUse != null ?
                this.owner.getBean(lo.getBeanName(), argsToUse) :
                this.owner.getBean(lo.getBeanName()));
    }else {
        return (argsToUse != null ? 
                this.owner.getBean(method.getReturnType(), argsToUse) :
                this.owner.getBean(method.getReturnType()));
    }
}

ReplaceOverrideMethodInterceptor中的intercept方法会回调配置的MethodReplacer接口实现类的reimplement方法



    

public Object intercept(Object obj, Method method, Object[] args, MethodProxy mp) {
    ReplaceOverride ro = (ReplaceOverride) getBeanDefinition().getMethodOverrides().getOverride(method);
    Assert.state(ro != null, "ReplaceOverride not found");
    // TODO could cache if a singleton for minor performance optimization
    // 获取replaced-method标签中配置的replacer对应的bean
    MethodReplacer mr = this.owner.getBean(ro.getMethodReplacerBeanName(), MethodReplacer.class);
    // 回调bean的reimplement方法
    return mr.reimplement(obj, method, args);
}

无参的构造函数调用

调用无参的构造函数AbstractAutowireCapableBeanFactory#instantiateBean

protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {
    Object beanInstance;
    final BeanFactory parent = this;
    // 安全检查
    if (System.getSecurityManager() != null) {
       // 授权给当前类一个 getInstantiationStrategy().instantiate这个方法的执行权限
    }else {
        // 实例化 => SimpleInstantiationStrategy.instantiate
        beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
    }
    // 包裹真实的对象并返回包装对象
    BeanWrapper bw = new BeanWrapperImpl(beanInstance);
    initBeanWrapper(bw);
    return bw;
}

实例化对象的逻辑SimpleInstantiationStrategy.instantiate

public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) {
    // 如果不存在方法的复写(lookup-method / replace-method )那么使用反射创建对象
    // 存在方法复写,使用cglib进行实例化
    if (!bd.hasMethodOverrides()) {
        Constructor constructorToUse;
        synchronized (bd.constructorArgumentLock) {
            // constructorToUse 表示用来实例对象的构造方法
            constructorToUse = (Constructor) bd.resolvedConstructorOrFactoryMethod;
            if (constructorToUse == null) {
                final Class clazz = bd.getBeanClass();
                if (clazz.isInterface()) {
                    throw new BeanInstantiationException(clazz, "Specified class is an interface");
                }
                bd.resolvedConstructorOrFactoryMethod = constructorToUse;
            }
        }
        // 通过构造函数实例出对象 => constructorToUse.newInstance(args)
        return BeanUtils.instantiateClass(constructorToUse);
    }else {
        // Must generate CGLIB subclass. 使用CGlib生成beanClass的子类,返回的是子类的对象
        // 这里逻辑和调用有参的构造函数创建cglib代理一致,只是传入的构造函数是一个null值
        return instantiateWithMethodInjection(bd, beanName, owner);
    }
}

至此,对象的实例化就完成了。

回调BeanPostProcessor(三)

当创建的非FactoryBean的对象创建完成之后,会返回一个BeanWrapper,这个类包装了bean对象。

// AbstractAutowireCapableBeanFactory#doCreateBean
if (instanceWrapper == null) {
    // 说明不是FactoryBean,在这里实例化bean
    instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// bean是真实的对象
final Object bean = instanceWrapper.getWrappedInstance();
Class beanType = instanceWrapper.getWrappedClass();

第三次后置处理器的回调:

  • 实例化对象之后,仅仅只是完成了类的初始化工作,还未涉及到数据的填充,初始化方法的执行。这里的回调就是缓存bean中的生命周期函数,解析@Resource @Inject @Autowired等注解,为后续注入依赖,回调声明周期函数做准备

  • 虽然会调用三个类的postProcessMergedBeanDefinition方法,但是主要看CommonAnnotationBeanPostProcessor#postProcessMergedBeanDefinition和AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition

  • CommonAnnotationBeanPostProcessor:主要缓存bean的声明周期函数,bean内部的@Resource的注解

  • AutowiredAnnotationBeanPostProcessor:缓存一个类中所有@Autowired、@Value和@Inject注解的方法和字段。

applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
// AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class beanType, String beanName) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof MergedBeanDefinitionPostProcessor) {
            // CommonAnnotationBeanPostProcessor
            // AutowiredAnnotationBeanPostProcessor
            // ApplicationListenerDetector
            MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProcessor) bp;
            bdp.postProcessMergedBeanDefinition(mbd, beanType, beanName);
        }
    }
}

CommonAnnotationBeanPostProcessor

public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) {
    // 检查@PostConstruct/@PreDestroy
    super.postProcessMergedBeanDefinition(beanDefinition, beanType, beanName);
    // 检查@Resource注解
    InjectionMetadata metadata = findResourceMetadata(beanName, beanType, null);
    metadata.checkConfigMembers(beanDefinition);
}

获取bean对象的中的生命周期回调函数

// 父类的postProcessMergedBeanDefinition方法
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) {
    // 拿到 bd 对应的生命周期回调信息
    LifecycleMetadata metadata = findLifecycleMetadata(beanType);
    metadata.checkConfigMembers(beanDefinition);
}
private LifecycleMetadata findLifecycleMetadata(Class clazz) {
    if (this.lifecycleMetadataCache == null) {
        // 初始化缓存map对象
        return buildLifecycleMetadata(clazz);
    }
    // 从Map获取生命周期回调的元数据,包括回调的类 初始方法集合  销毁方法集合
    // 第一次获取肯定是没有的
    LifecycleMetadata metadata = this.lifecycleMetadataCache.get(clazz);
    if (metadata == null) {
        synchronized (this.lifecycleMetadataCache) {
            metadata = this.lifecycleMetadataCache.get(clazz);
            if (metadata == null) {
                // 没有就创建(检查类中的注解,核心方法),并放入map中
                metadata = buildLifecycleMetadata(clazz);
                // 获取到回调函数之后会缓存起来
                this.lifecycleMetadataCache.put(clazz, metadata);
            }
            return metadata;
        }
    }
    return metadata;
}

关键方法

  • 在CommonAnnotationBeanPostProcessor对象创建时调用了父类的set方法, 设置了InitAnnotation和DestroyAnnotation
public CommonAnnotationBeanPostProcessor() {
    setOrder(Ordered.LOWEST_PRECEDENCE - 3);
    setInitAnnotationType(PostConstruct.class);
    setDestroyAnnotationType(PreDestroy.class);
    ignoreResourceType("javax.xml.ws.WebServiceContext");
}
  • 遍历类中的所有方法,判断是否存在initAnnotationType或者destroyAnnotationType
do {
    ReflectionUtils.doWithLocalMethods(targetClass, method -> {
        if (this.initAnnotationType != null && method.isAnnotationPresent(this.initAnnotationType)) {
            LifecycleElement element = new LifecycleElement(method);
            currInitMethods.add(element);
        }
        if (this.destroyAnnotationType != null && method.isAnnotationPresent(this.destroyAnnotationType)) {
            currDestroyMethods.add(new LifecycleElement(method));
        }
    });
    initMethods.addAll(0, currInitMethods);
    destroyMethods.addAll(currDestroyMethods);
}while (targetClass != null && targetClass != Object.class);
return new LifecycleMetadata(clazz, initMethods, destroyMethods);
  • @Resource注解和@Autowired注解处理与上述过程类似,这两者解析的结果都被缓存在一个相同的Map(injectionMetadataCache)中。在下次依赖注入时直接从缓存中就可以获取到依赖信息。

回调BeanPostProcessor(四)

第四次回调的作用:在对象没有放入singletonObjects之前调用,返回一个提前暴露的对象,在这个后置处理器中可以对这个bean进行修改

// AbstractAutowireCapableBeanFactory#doCreateBean
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
                                  isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
    // getEarlyBeanReference 后置处理器的第四次回调  => AutowiredAnnotationBeanPostProcessor
    // SmartInstantiationAwareBeanPostProcessor 的 getEarlyBeanReference 方法
    addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}

关键在SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

// SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference
public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
    return bean;
}

这里的addSingletonFactory方法非常的关键,主要是为了解决Spring中循环依赖的问题。

接下来就是解决Bean对象的属性装配和生命周期函数回调

// AbstractAutowireCapableBeanFactory#doCreateBean
Object exposedObject = bean;
// 解决属性装配
populateBean(beanName, mbd, instanceWrapper);
// 调用 BeanPostProcessor实现类的方法和自定义的初始化回调方法
exposedObject = initializeBean(beanName, exposedObject, mbd);

回调BeanPostProcessor(五)

第五次回调后置处理器,断定是否需要进行属性装配,当然默认的都是返回true,表示会自动装配。

// AbstractAutowireCapableBeanFactory#populateBean
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            // CommonAnnotationBeanPostProcessor.postProcessAfterInstantiation() => return true
            // AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation() => return true
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                continueWithPropertyPopulation = false;
                break;
            }
        }
    }
}
// 如果不自动注入,在这里就直接返回了
if (!continueWithPropertyPopulation) {
    return;
}

选择Bean的装配模式

PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
// 选择bd的装配模式,默认是 AUTOWIRE_NO
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
    MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    // Add property values based on autowire by name if applicable.
    if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
        autowireByName(beanName, mbd, bw, newPvs);
    }
    // Add property values based on autowire by type if applicable.
    if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
        autowireByType(beanName, mbd, bw, newPvs);
    }
    pvs = newPvs;
}

回调BeanPostProcessor(六)

第六次回调正式进行属性的注入

// 检查是否存在 InstantiationAwareBeanPostProcessor 接口的实现类
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
// 是否需要深度检查
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
PropertyDescriptor[] filteredPds = null;
if (hasInstAwareBpps) {
    if (pvs == null) {
        pvs = mbd.getPropertyValues();
    }
    // 第六次后置处理器的回调 InstantiationAwareBeanPostProcessor 的 postProcessProperties 方法,处理属性
    // CommonAnnotationBeanPostProcessor 处理 Resource 注解
    // AutowiredAnnotationBeanPostProcessor 处理 Autowired Inject注解
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
            if (pvsToUse == null) {
                if (filteredPds == null) {
                    filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                }
                pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    return;
                }
            }
            pvs = pvsToUse;
        }
    }
}
if (needsDepCheck) {
    if (filteredPds == null) {
        filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    }
    // 深度检查依赖
    checkDependencies(beanName, mbd, filteredPds, pvs);
}

if (pvs != null) {
    applyPropertyValues(beanName, mbd, bw, pvs);
}

回调BeanPostProcessor(七、八)

第七次回调是在属性注入完成之后,执行BeanPostProcessor的 postProcessBeforeInitialization 方法,也就是init方法或者@PostConstruct方法。

第八次回调,执行BeanPostProcessor的postProcessAfterInitialization 方法,AOP的代理对象就是在这里生成的。

// AbstractAutowireCapableBeanFactory#initializeBean
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    // 回调 BeanNameAware/BeanClassLoaderAware/BeanFactoryAware 接口
    invokeAwareMethods(beanName, bean);
    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        // 第七次调用
        // beanPostProcessor 的 beanPostProcessorsBeforeInitialization 方法
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }
    // 调用init方法  @PostConstruct
    invokeInitMethods(beanName, wrappedBean, mbd);
    if (mbd == null || !mbd.isSynthetic()) {
        // beanPostProcessor 的 beanPostProcessorsAfterInitialization 方法
        // AOP的代理对象就是在这里生成的
        // 第八次调用
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    return wrappedBean;
}

回调BeanPostProcessor(九)

第九次回调,在bean销毁之前的回调,在容器关闭时调用(context.close())

// DisposableBeanAdapter#destroy
public void destroy() {
    if (!CollectionUtils.isEmpty(this.beanPostProcessors)) {
        // 处理系统中的 DestructionAwareBeanPostProcessor 接口 回调beanPostProcessor
        for (DestructionAwareBeanPostProcessor processor : this.beanPostProcessors) {
            processor.postProcessBeforeDestruction(this.bean, this.beanName);
        }
    }
    if (this.destroyMethod != null) {
        // 处理销毁方法回调 @PreDestroy
        invokeCustomDestroyMethod(this.destroyMethod);
    }
    else if (this.destroyMethodName != null) {
        // 调用指定的销毁回调方法
        Method methodToInvoke = determineDestroyMethod(this.destroyMethodName);
        if (methodToInvoke != null) {
            invokeCustomDestroyMethod(ClassUtils.getInterfaceMethodIfPossible(methodToInvoke));
        }
    }
}

总结:在spring容器中,BeanPostProcessor一共回调了九次

你可能感兴趣的:(Bean对象创建流程)