完全搞懂依赖注入(一)Bean实例建立过程

 

 

上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入(IOC 依赖注入)。php

那什么是依赖注入呢?java

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。再完成IOC容器初始化以后,也就是所谓的Bean加载完成后,咱们须要对这些Bean进行调用和获取,这个过程就叫依赖注入。web

那何时会触发依赖注入呢?spring

  1. 经过getBean()方法获取Bean对象。缓存

  2. 给Bean配置了懒加载,ApplicationContext启动完成后调用getBean()来实例化对象。安全

如今计算机性能已经足够,不是特殊要求下尽可能别作懒加载,这样的话能够减小web运行时的调用时间开销。session

好了,介绍完这些就开始咱们的DI之旅。app

1. BeanFactory

经过Spring获取Bean的最根本的接口。ide

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

  1. // 若是myJndiObject时FactoryBean, 则 &myJndiObject 将返回工厂而不是返回实例。post

  2. String FACTORY_BEAN_PREFIX = "&";

  3. // 获取bean实例

  4. Object getBean(String name) throws BeansException;

  5. // 判断一个bean是否时单例

  6. boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

  7. // 判断一个bean是不是原型

  8. boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

  9. // 检查bean的name和type是否匹配

  10. boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException;

  11. // 获取bean类型

  12. Class<?> getType(String name) throws NoSuchBeanDefinitionException;

  13. // 获取bean别名

  14. String[] getAliases(String name);

getBean()方法有不少重载方法,上面只总结了一个。这个方法是DI的入口方法,接下来会从这个方法开始往下研究。

2. AbstractBeanFactory

从名字也能看出,这是BeanFactory的抽象实现类。

  1. public Object getBean(String name) throws BeansException {

  2.    return doGetBean(name, null, null, false);

  3. }

doGetBean()方法也是该类中的方法。

  1. // 依赖注入 从这里开始发生

  2. private <T> T doGetBean(

  3.        final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly)

  4.        throws BeansException {

  5.  

  6.    // 根据指定名字获取被管理Bean的名称

  7.    // 若是是别名, 则转换为真正的bean名

  8.    final String beanName = transformedBeanName(name);

  9.    Object bean;

  10.  

  11.    // Eagerly check singleton cache for manually registered singletons.

  12.    // 先从缓存中取单例 bean

  13.    Object sharedInstance = getSingleton(beanName);

  14.    if (sharedInstance != null && args == null) {

  15.        if (logger.isDebugEnabled()) {

  16.            // 若是有,则直接返回该bean

  17.            if (isSingletonCurrentlyInCreation(beanName)) {

  18.                logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +

  19.                        "' that is not fully initialized yet - a consequence of a circular reference");

  20.            }

  21.            else {

  22.                logger.debug("Returning cached instance of singleton bean '" + beanName + "'");

  23.            }

  24.        }

  25.        //获取 bean 的实例对象

  26.        bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);

  27.    }

  28.  

  29.    else {

  30.        // Fail if we're already creating this bean instance:

  31.        // We're assumably within a circular reference.

  32.        // 若是不是单例对象, 并且 缓存中有原型模式bean, 就抛异常

  33.        if (isPrototypeCurrentlyInCreation(beanName)) {

  34.            throw new BeanCurrentlyInCreationException(beanName);

  35.        }

  36.  

  37.        // 检查 BeanDefinition 是否再当前的factory中, 若是不在则委托父类容器取查找

  38.        // Check if bean definition exists in this factory.

  39.        BeanFactory parentBeanFactory = getParentBeanFactory();

  40.        if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {

  41.            // Not found -> check parent.

  42.            String nameToLookup = originalBeanName(name);

  43.            if (args != null) {

  44.                // Delegation to parent with explicit args.

  45.                // 委托父类容器取找(名字+参数)

  46.                return (T) parentBeanFactory.getBean(nameToLookup, args);

  47.            }

  48.            else {

  49.                // 委托父类容器取找(名称+类型)

  50.                // No args -> delegate to standard getBean method.

  51.                return parentBeanFactory.getBean(nameToLookup, requiredType);

  52.            }

  53.        }

  54.  

  55.        if (!typeCheckOnly) {

  56.            // 标记 bean 被建立

  57.            markBeanAsCreated(beanName);

  58.        }

  59.  

  60.        // 根据bean名称获取 父类的 beanDefinition, 合并继承公共属性

  61.        final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);

  62.        checkMergedBeanDefinition(mbd, beanName, args);

  63.  

  64.        // Guarantee initialization of beans that the current bean depends on.

  65.        // 获取当前bean 全部依赖Bean 的集合

  66.        String[] dependsOn = mbd.getDependsOn();

  67.        if (dependsOn != null) {

  68.            for (String dependsOnBean : dependsOn) {

  69.                // 递归调用, 获取当前Bean的依赖Bean

  70.                getBean(dependsOnBean);

  71.                // 把依赖Bean注册给当前的Bean

  72.                registerDependentBean(dependsOnBean, beanName);

  73.            }

  74.        }

  75.  

  76.        // Create bean instance.

  77.        // 建立bean 实例

  78.        if (mbd.isSingleton()) {

  79.            // 建立 bean 实例对象, 而且注册给所依赖的对象

  80.            sharedInstance = getSingleton(beanName, new ObjectFactory() {

  81.                public Object getObject() throws BeansException {

  82.                    try {

  83.                        // 建立一个指定bean 实例对象

  84.                        return createBean(beanName, mbd, args);

  85.                    }

  86.                    catch (BeansException ex) {

  87.                        // Explicitly remove instance from singleton cache: It might have been put there

  88.                        // eagerly by the creation process, to allow for circular reference resolution.

  89.                        // Also remove any beans that received a temporary reference to the bean.

  90.                        // 清除该单例

  91.                        destroySingleton(beanName);

  92.                        throw ex;

  93.                    }

  94.                }

  95.            });

  96.            bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);

  97.        }

  98.  

  99.        else if (mbd.isPrototype()) {

  100.            // It's a prototype -> create a new instance.

  101.            Object prototypeInstance = null;

  102.            try {

  103.                beforePrototypeCreation(beanName);

  104.                prototypeInstance = createBean(beanName, mbd, args);

  105.            }

  106.            finally {

  107.                afterPrototypeCreation(beanName);

  108.            }

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

  110.        }

  111.  

  112.        // 若是建立的bean 不是单例也不是原型, 则根据声明周期选择实例化bean的方法

  113.        // 如 request session 等不一样范围的实例

  114.        else {

  115.            String scopeName = mbd.getScope();

  116.            final Scope scope = this.scopes.get(scopeName);

  117.            // 若是 scope 是空, 则抛异常

  118.            if (scope == null) {

  119.                throw new IllegalStateException("No Scope registered for scope '" + scopeName + "'");

  120.            }

  121.            // 不然

  122.            try {

  123.                // 获取一个指定了scope的bean实例

  124.                Object scopedInstance = scope.get(beanName, new ObjectFactory() {

  125.                    public Object getObject() throws BeansException {

  126.                        beforePrototypeCreation(beanName);

  127.                        try {

  128.                            return createBean(beanName, mbd, args);

  129.                        }

  130.                        finally {

  131.                            afterPrototypeCreation(beanName);

  132.                        }

  133.                    }

  134.                });

  135.                bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);

  136.            }

  137.            catch (IllegalStateException ex) {

  138.                throw new BeanCreationException(beanName,

  139.                        "Scope '" + scopeName + "' is not active for the current thread; " +

  140.                        "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton",

  141.                        ex);

  142.            }

  143.        }

  144.    }

  145.  

  146.    // Check if required type matches the type of the actual bean instance.

  147.    // 检查是否须要类型检测

  148.    if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {

  149.        throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());

  150.    }

  151.    return (T) bean;

  152. }

总结如下它都作了什么事情:

一、根据传来的 bean的 name(有多是别名)来获取真正的 bean名称: beanName

二、根据 beanName获取单例实例,若是有直接获取到 bean实例并返回,DI完成。

三、若是根据 beanName没有得到到单例实例:

3.1 判断是否是原型实例,若是是,则抛出建立失败异常,若是不是,下一步。

3.2 检查 BeanDefinition 是否在当前的容器中,若是不在那可能在父类容器中,因此委托父类容器查找,若是尚未,则再上一级容器...递归查找。

3.3 检查这个实例是不是为了类型检查而获取,而不是用来使用,若是是,标记这个bean已经被建立,若是不是,下一步。

3.4 根据 beanName获取 父类的BeanDefinition,并检查该对象类类型,好比不能是抽象类等。

3.5 根据 beanName获取全部该 bean依赖的 Bean集合,若是该集合有值,则遍历DI(递归调用 getBean())该 bean集合里的bean,并把bean注册给当前的bean(维护了一个 map来存放关系)。

3.6 若是3.4中获取的 BeanDefinition是单例,则根据该单例对象和 beanName和 args建立一个实例对象;不然,判断 BeanDefinition是不是原型,若是是则根据 beanName,该对象, args建立一个实例;不然拿到3.4获取的 BeanDefinition对象的生命周期 Scope,而后根据 scope来建立实例对象,参数 (beanName,bd,args)

  1. 3.7 检查是否须要类型检测

  2.  

  3. 3.8 返回`3.1-3.7 `生成的实例。

而后咱们再看看 createBean()方法的实现。
  1.    protected abstract Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)

  2.            throws BeanCreationException;

3. AbstractAutowireCapableBeanFactory.java

  1. // 建立bean 实例

  2. @Override

  3. protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)

  4.        throws BeanCreationException {

  5.  

  6.    if (logger.isDebugEnabled()) {

  7.        logger.debug("Creating instance of bean '" + beanName + "'");

  8.    }

  9.    // Make sure bean class is actually resolved at this point.

  10.    // 解析和肯定 bean 能够实例化

  11.    resolveBeanClass(mbd, beanName);

  12.  

  13.    // Prepare method overrides.

  14.    // 准备方法覆盖

  15.    try {

  16.        mbd.prepareMethodOverrides();

  17.    }

  18.    catch (BeanDefinitionValidationException ex) {

  19.        throw new BeanDefinitionStoreException(mbd.getResourceDescription(),

  20.                beanName, "Validation of method overrides failed", ex);

  21.    }

  22.  

  23.    try {

  24.        // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.

  25.        // 给 Bean处理器 一个机会, 返回一个目标bean实例

  26.        Object bean = resolveBeforeInstantiation(beanName, mbd);

  27.        if (bean != null) {

  28.            return bean;

  29.        }

  30.    }

  31.    catch (Throwable ex) {

  32.        throw new BeanCreationException(mbd.getResourceDescription(), beanName,

  33.                "BeanPostProcessor before instantiation of bean failed", ex);

  34.    }

  35.  

  36.    Object beanInstance = doCreateBean(beanName, mbd, args);

  37.    if (logger.isDebugEnabled()) {

  38.        logger.debug("Finished creating instance of bean '" + beanName + "'");

  39.    }

  40.    return beanInstance;

  41. }

总结如下它都作了什么:

  1. 肯定 beanName和 RootBeanDefinition能够被实例化。

  2. 执行方法覆盖

  3. 看 BeanPostProcessors可否再解析以前获取到bean,若是能则直接返回,不然下一步。

  4. 调用 doCreateBean()方法,获取 bean实例.

doCreateBean()方法也是该类中的。

  1. // 真正建立bean实例

  2. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {

  3.    // Instantiat|e the bean.

  4.    // 封装bean

  5.    BeanWrapper instanceWrapper = null;

  6.    if (mbd.isSingleton()) {

  7.        // 若是是单例模式的bean,从容器中获取同名bean

  8.        instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);

  9.    }

  10.    // 若是没有同名bean, 则建立bean实例

  11.    if (instanceWrapper == null) {

  12.        instanceWrapper = createBeanInstance(beanName, mbd, args);

  13.    }

  14.    // 若是有同名bean, 则获取到封装实例

  15.    final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);

  16.    // 获取实例化对象类型

  17.    Class beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);

  18.  

  19.    // Allow post-processors to modify the merged bean definition.

  20.    // 调用后置处理器

  21.    synchronized (mbd.postProcessingLock) {

  22.        if (!mbd.postProcessed) {

  23.            applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);

  24.            mbd.postProcessed = true;

  25.        }

  26.    }

  27.  

  28.    // Eagerly cache singletons to be able to resolve circular references

  29.    // even when triggered by lifecycle interfaces like BeanFactoryAware.

  30.    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&

  31.            isSingletonCurrentlyInCreation(beanName));

  32.    if (earlySingletonExposure) {

  33.        if (logger.isDebugEnabled()) {

  34.            logger.debug("Eagerly caching bean '" + beanName +

  35.                    "' to allow for resolving potential circular references");

  36.        }

  37.        addSingletonFactory(beanName, new ObjectFactory() {

  38.            public Object getObject() throws BeansException {

  39.                return getEarlyBeanReference(beanName, mbd, bean);

  40.            }

  41.        });

  42.    }

  43.  

  44.    // Initialize the bean instance.

  45.    // bean对象初始化, 依赖注入开始,exposedObject就是完成后的bean

  46.    Object exposedObject = bean;

  47.    try {

  48.        // 将bean 实例封装, 而且 bean 定义中配置的属性值赋值给实例对象

  49.        populateBean(beanName, mbd, instanceWrapper);

  50.        // 初始化 bean对象

  51.        exposedObject = initializeBean(beanName, exposedObject, mbd);

  52.    }

  53.    catch (Throwable ex) {

  54.        if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {

  55.            throw (BeanCreationException) ex;

  56.        }

  57.        else {

  58.            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);

  59.        }

  60.    }

  61.  

  62.    // 若是指定名称bean已经注册单例模式

  63.    if (earlySingletonExposure) {

  64.        Object earlySingletonReference = getSingleton(beanName, false);

  65.        if (earlySingletonReference != null) {

  66.            if (exposedObject == bean) {

  67.                // 若是两个对象相等, bean初始化完成

  68.                exposedObject = earlySingletonReference;

  69.            }

  70.            // 若是不相等, 则找出当前bean的依赖bean

  71.            else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {

  72.                String[] dependentBeans = getDependentBeans(beanName);

  73.                Set<String> actualDependentBeans = new LinkedHashSet<String>(dependentBeans.length);

  74.                for (String dependentBean : dependentBeans) {

  75.                    // 检查依赖bean (是否继承接口,是不是父子关系。。)

  76.                    if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {

  77.                        actualDependentBeans.add(dependentBean);

  78.                    }

  79.                }

  80.                if (!actualDependentBeans.isEmpty()) {

  81.                    throw new BeanCurrentlyInCreationException(beanName,

  82.                            "Bean with name '" + beanName + "' has been injected into other beans [" +

  83.                            StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +

  84.                            "] in its raw version as part of a circular reference, but has eventually been " +

  85.                            "wrapped. This means that said other beans do not use the final version of the " +

  86.                            "bean. This is often the result of over-eager type matching - consider using " +

  87.                            "'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");

  88.                }

  89.            }

  90.        }

  91.    }

  92.  

  93.    // Register bean as disposable.

  94.    // 注册完成依赖注入的bean

  95.    try {

  96.        registerDisposableBeanIfNecessary(beanName, bean, mbd);

  97.    }

  98.    catch (BeanDefinitionValidationException ex) {

  99.        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);

  100.    }

  101.  

  102.    return exposedObject;

  103. }

一样,总结如下它干的事情:

  1. 根据 beanName获取 beanWrapper对象。若是 beanWrapper对象是空,则调用 createBeanInstance()方法建立 bean实例。不然,下一步

  2. 经过 beanWrapper对象获取bean实例和 class类型。

  3. 容许 postProcessors 调整组合 BeanDefinition

  4. 若是 RootBeanDefinition是单例而且容许循环引用而且 beanName正在进行单例建立,将 beanName添加到单例工厂。

  5. 调用 populateBean()方法给bean的属性值赋值,而后初始化bean对象并返回建立的bean实例,若是抛异常,则下一步。

  6. 若是该 beanName对象已经注册单例模式,则从单例中获取,并判断获取到的bean实例( B)与 BeanWrapper中的bean实例( A)是同一个实例,若是是,则返回 A或者 B,若是不是,则递归找出它的依赖 bean

  7. 返回 1-6产生的 bean实例。

咱们首次获取bean实例的时候,bean工厂是确定没有的,因此咱们首次获取到的BeanWrapper应该是空对象,可是它调用了 createBeanInstance()方法后,能够看到spring是很肯定它能拿到对象,那么咱们看看这个方法的实现。它仍然是这个类中的方法。

  1. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {

  2.    // Make sure bean class is actually resolved at this point.

  3.    // 确保bean可实例化(不能是抽象类等)

  4.    Class beanClass = resolveBeanClass(mbd, beanName);

  5.  

  6.    // 若是这个bean 不是public 修饰符或者不被容许公共访问, 抛出异常

  7.    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {

  8.        throw new BeanCreationException(mbd.getResourceDescription(), beanName,

  9.                "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());

  10.    }

  11.  

  12.    if (mbd.getFactoryMethodName() != null)  {

  13.        // 经过工厂方法实例化

  14.        return instantiateUsingFactoryMethod(beanName, mbd, args);

  15.    }

  16.  

  17.    // Shortcut when re-creating the same bean...

  18.    // 是否有构造器

  19.    if (mbd.resolvedConstructorOrFactoryMethod != null && args == null) {

  20.        if (mbd.constructorArgumentsResolved) {

  21.            return autowireConstructor(beanName, mbd, null, null);

  22.        }

  23.        else {

  24.            return instantiateBean(beanName, mbd);

  25.        }

  26.    }

  27.  

  28.    // Need to determine the constructor...

  29.    // 须要确认构造器

  30.    Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

  31.    if (ctors != null ||

  32.            mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||

  33.            mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {

  34.        // 自动装配,调用匹配的构造方法进行实例化

  35.        return autowireConstructor(beanName, mbd, ctors, args);

  36.    }

  37.  

  38.    // No special handling: simply use no-arg constructor.

  39.    // 使用默认无参构造

  40.    return instantiateBean(beanName, mbd);

  41. }

这个类用来建立 Bean实例,而后返回 BeanWrapper对象。注释写的很详细了。其中有个 instantiateBean()方法,当没有参数和构造方法的时候,就会调用该方法来实例化bean。

  1. // 使用默认无参构造方法实例化bean

  2. protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {

  3.    try {

  4.        Object beanInstance;

  5.        final BeanFactory parent = this;

  6.        // 获取JDK安全管理

  7.        if (System.getSecurityManager() != null) {

  8.            // 根据实例化策略实例化对象

  9.            beanInstance = AccessController.doPrivileged(new PrivilegedAction<Object>() {

  10.  

  11.                public Object run() {

  12.                    return getInstantiationStrategy().instantiate(mbd, beanName, parent);

  13.                }

  14.            }, getAccessControlContext());

  15.        }

  16.        else {

  17.            beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);

  18.        }

  19.        // 对实例化对象进行封装

  20.        BeanWrapper bw = new BeanWrapperImpl(beanInstance);

  21.        initBeanWrapper(bw);

  22.        return bw;

  23.    }

  24.    catch (Throwable ex) {

  25.        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);

  26.    }

  27. }

这个方法是使用默认无参构造方法实例化bean的,它的核心代码是 getInstantiationStrategy().instantiate(mbd,beanName,parent);,由于它,咱们能够获得一个bean实例对象,而后封装成 BeanWrapper并返回。

4. SimpleInstantiationStrategy.java

用于BeanFactory的简单对象实例化策略。不支持方法注入,尽管它提供了子类的hook来覆盖以添加方法注入支持,例如经过重写方法。

  1. // 使用初始化策略 实例化bean

  2. public Object instantiate(

  3.        RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {

  4.  

  5.    // Don't override the class with CGLIB if no overrides.

  6.    // 若是beanDefinition 中没有方法覆盖, 就用jdk,不然用cglib

  7.    if (beanDefinition.getMethodOverrides().isEmpty()) {

  8.        // 获取对象的构造方法和工厂方法

  9.        Constructor constructorToUse = (Constructor) beanDefinition.resolvedConstructorOrFactoryMethod;

  10.  

  11.        if (constructorToUse == null) {

  12.            // 若是 没有构造方法和工厂方法, 使用JDK反射, 判断实例化的bean是否是接口

  13.            final Class clazz = beanDefinition.getBeanClass();

  14.            if (clazz.isInterface()) {

  15.                throw new BeanInstantiationException(clazz, "Specified class is an interface");

  16.            }

  17.            try {

  18.                if (System.getSecurityManager() != null) {

  19.                    // 使用反射获取bean构造方法

  20.                    constructorToUse = AccessController.doPrivileged(new PrivilegedExceptionAction<Constructor>() {

  21.                        public Constructor run() throws Exception {

  22.                            return clazz.getDeclaredConstructor((Class[]) null);

  23.                        }

  24.                    });

  25.                } else {

  26.                    constructorToUse =  clazz.getDeclaredConstructor((Class[]) null);

  27.                }

  28.                beanDefinition.resolvedConstructorOrFactoryMethod = constructorToUse;

  29.            }

  30.            catch (Exception ex) {

  31.                throw new BeanInstantiationException(clazz, "No default constructor found", ex);

  32.            }

  33.        }

  34.        // 使用beanUtils实例化   构造方法.newInstance(arg) 来实例化

  35.        return BeanUtils.instantiateClass(constructorToUse);

  36.    }

  37.    else {

  38.        //若是 有覆盖或者重写, 则用CGLIB来实例化对象

  39.        // Must generate CGLIB subclass.

  40.        return instantiateWithMethodInjection(beanDefinition, beanName, owner);

  41.    }

  42. }

总结它的步骤:

  1. 若是BeanDefinition的覆盖方法不为空,则交给CGLIB来实例化对象,不然获取构造方法和工厂方法,下一步。

  2. 若是没有构造方法和工厂方法,则使用JDK反射,判断实例化的bean是否是接口,若是是,抛出异常,若是不是,则使用反射来获取bean的构造方法,最后,用 构造器.newInstance()的方法( BeanUtils.instantiateClass()方法底层实现)来实例化并返回。

那cglib是如何实例化呢,咱们来看下 instantiateWithMethodInjection(beanDefinition,beanName,owner);方法源码:

  1. @Override

  2. protected Object instantiateWithMethodInjection(

  3.        RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) {

  4.  

  5.    // Must generate CGLIB subclass.

  6.    return new CglibSubclassCreator(beanDefinition, owner).instantiate(null, null);

  7. }

而后再跟进 CglibSubclassCreator(beanDefinition,owner).instantiate(null,null);方法:

  1. // 使用cglib 来进行bean实例化

  2. public Object instantiate(Constructor ctor, Object[] args) {

  3.    // cglib

  4.    Enhancer enhancer = new Enhancer();

  5.    // bean自己做为基类

  6.    enhancer.setSuperclass(this.beanDefinition.getBeanClass());

  7.    enhancer.setCallbackFilter(new CallbackFilterImpl());

  8.    enhancer.setCallbacks(new Callback[] {

  9.            NoOp.INSTANCE,

  10.            new LookupOverrideMethodInterceptor(),

  11.            new ReplaceOverrideMethodInterceptor()

  12.    });

  13.  

  14.    // 生成实例对象

  15.    return (ctor == null) ?

  16.            enhancer.create() :

  17.            enhancer.create(ctor.getParameterTypes(), args);

  18. }

从上面代码能够看到,这就是CGLIB动态代理中建立代理的过程代码,不熟悉的能够往前翻 完全搞懂动态代理章节的内容。

好了,到了这里,Spring就完成了bean实例的建立,可是此时就能拿着这个实例去使用吗,显然是不能够,由于属性尚未被赋入,下一章再继续介绍如何将属性依赖关系注入到Bean实例对象。

相关文章
相关标签/搜索