Spring的IOC的源码解析(三)

本文深入探讨了Spring IOC容器在创建bean实例时的详细过程,涉及BeanPostProcessor、bean的实例化策略,如工厂方法、构造器注入、普通实例化等,并分析了CGLIB在实例化中的作用。此外,还讨论了InstantiationAwareBeanPostProcessor在bean实例化过程中的应用及其如何与AOP代理相结合。
摘要由CSDN通过智能技术生成
在《Spring的IOC的源码解析(二)》中完成了BFPP和BPP的处理分析;这篇接着分bean的实例化。
在用bean工厂创建bean对象时,调用的是父类AbstractBeanFactory中提供的getBean的系列方法。往下,在AbstractAutowireCapableBeanFactory的createBean方法中,有下边一段代码,
try {
    // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    Object bean = resolveBeforeInstantiation(beanName, mbdToUse); //看分析(1)
    if (bean != null) {
        return bean;
    }
}
catch (Throwable ex) {
    throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
            "BeanPostProcessor before instantiation of bean failed", ex);
}
try {
    Object beanInstance = doCreateBean(beanName, mbdToUse, args); //生成实例,看分析(2)
    if (logger.isDebugEnabled()) {
        logger.debug("Finished creating instance of bean '" + beanName + "'");
    }
    return beanInstance;
}

(1) 继续看 resolveBeforeInstantiation方法
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        // Make sure bean class is actually resolved at this point.
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { // !mbd.isSynthetic()默认是true,如果注册了 InstantiationAwareBeanPostProcessors类型的BPP,右侧表达式也是true
            Class<?> targetType = determineTargetType(beanName, mbd);
            if (targetType != null) {
                bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                if (bean != null) {
                    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
}
mbd.isSynthetic()对于Pointcut 的bean来说是true的!
很明显,如果在这里就返回bean 是不可能的。
(2)下边看看bean的创建
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) { //如果是单例bean,从缓存获取
    instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
    instanceWrapper = createBeanInstance(beanName, mbd, args); //真正创建实例;继续看(3)
}
final Object bean = instanceWrapper.getWrappedInstance();
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass(); //获取实例化类的类型
if (beanType != NullBean.class) {
    mbd.resolvedTargetType = beanType; //设置到mdb
}
synchronized (mbd.postProcessingLock) {
    if (!mbd.postProcessed) {
        try {
            applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName); //调用MergedBeanDefinitionPostProcessor BPP处理
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName,
                    "Post-processing of merged bean definition failed", ex);
        }
        mbd.postProcessed = true;
    }
}
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletonCurrentlyInCreation(beanName)); //默认允许处理循环引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值