Spring 创建Bean实例源码

1

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
        throws BeanCreationException {

    
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        // 工厂Bean缓存中获取
        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    if (instanceWrapper == null) {
        // 实例化Bean
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }
    ...省略
    return exposedObject;
}
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    // 解析Bean 的Class
    Class<?> beanClass = resolveBeanClass(mbd, beanName);
    // 判断class不为空,并且访问权限是public
    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 接口,来创建 Bean 实例
    Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
    if (instanceSupplier != null) {
        return obtainFromSupplier(instanceSupplier, beanName);
    }
    // 获取 工厂方法,来创建 Bean 实例
    if (mbd.getFactoryMethodName() != null) {
        return instantiateUsingFactoryMethod(beanName, mbd, args);
    }

    // 通过构造方法来创建 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) {
            // 构造函数自动注入
            return autowireConstructor(beanName, mbd, null, null);
        }
        else {
            // 默认构造函数构造
            return instantiateBean(beanName, mbd);
        }
    }

    // 如果上面没找到有效的构造函数,就从BeanPostProcessor中查找,然后执行返回
    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);
}
protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
    try {
        Object beanInstance;
        if (System.getSecurityManager() != null) {
            beanInstance = AccessController.doPrivileged(
                    (PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this),
                    getAccessControlContext());
        }
        else {
            // 获取实例化策略并且进行实例化操作
            beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
        }
        // 包装成BeanWrapper
        BeanWrapper bw = new BeanWrapperImpl(beanInstance);
        initBeanWrapper(bw);
        return bw;
    }
    catch (Throwable ex) {
        throw new BeanCreationException(
                mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
    }
}
// 通过反射生成实例化对象
public Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {
    // 如果没有重写,不要用CGLIB重写类
    // 没有MethodOverrides对象,可以直接实例化
    if (!bd.hasMethodOverrides()) {
        Constructor<?> constructorToUse;
        // 锁定对象,使获得实例化构造方法线程安全
        synchronized (bd.constructorArgumentLock) {
            // 查看bd对象里使用否含有构造方法
            constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;
            if (constructorToUse == null) {
                final Class<?> clazz = bd.getBeanClass();
                // 如果要实例化的beanDefinition是一个接口,则直接抛出异常
                if (clazz.isInterface()) {
                    throw new BeanInstantiationException(clazz, "Specified class is an interface");
                }
                try {
                    // 获取系统安全管理器
                    if (System.getSecurityManager() != null) {
                        constructorToUse = AccessController.doPrivileged(
                                (PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
                    }
                    else {
                        // 获取声明的构造函数
                        constructorToUse = clazz.getDeclaredConstructor();
                    }
                    bd.resolvedConstructorOrFactoryMethod = constructorToUse;
                }
                catch (Throwable ex) {
                    throw new BeanInstantiationException(clazz, "No default constructor found", ex);
                }
            }
        }
        // 通过反射生成实例化对象
        return BeanUtils.instantiateClass(constructorToUse);
    }
    else {
        // 必须生成cglib子类
        return instantiateWithMethodInjection(bd, beanName, owner);
    }
}

 

posted @ 2020-12-13 23:14  柒月丶  阅读(255)  评论(0)    收藏  举报