`

SpringBean实例化对象

阅读更多

SpringBean实例化

1. Spring Bean实例化

1. 通过BeanName获取Class对象(resolveBeanClass(mbd, beanName);)

2. 处理lookup标签(mbdToUse.prepareMethodOverrides();)// Prepare method overrides.

3. 短路Bean的创建过程 Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

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

Object bean = resolveBeforeInstantiation(beanName, mbdToUse);

if (bean != null) {

    return bean;

}

 

Class<?> targetType = determineTargetType(beanName, mbd);

if (targetType != null) {

    bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

    if (bean != null) {

        bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);

    }

}

    

protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {

    for (BeanPostProcessor bp : getBeanPostProcessors()) {

        if (bp instanceof InstantiationAwareBeanPostProcessor) {

            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;

            Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);

            if (result != null) {

                return result;

            }

        }

    }

    return null;

}

 

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)

        throws BeansException {

 

    Object result = existingBean;

    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {

        result = beanProcessor.postProcessAfterInitialization(result, beanName);

        if (result == null) {

            return result;

        }

    }

    return result;

}

4. 实例化对象(doCreateBean(beanName, mbdToUse, args);)

  • 实例化对象(instanceWrapper = createBeanInstance(beanName, mbd, args))
    • 使用FactoryMethod实例化(instantiateUsingFactoryMethod(beanName, mbd, args);)
    • 解析过构造参数或FactoryMethod,才使用构造参数实例化(autowireConstructor(beanName, mbd, null, null);)
    • 使用策略实例化(instantiateBean(beanName, mbd);)InstantiationStrategy instantiationStrategy = new CglibSubclassingInstantiationStrategy();
    • if (bd.getMethodOverrides().isEmpty()) {
    •     // 反射初始化
    •     return BeanUtils.instantiateClass(constructorToUse);
    • } else {
    •     // Must generate CGLIB subclass.
    •     return instantiateWithMethodInjection(bd, beanName, owner);
    • }
    •  
  • 提前曝光实例(addSingletonFactory),循环依赖使用
  • 填充属性(populateBean(beanName, mbd, instanceWrapper);)
    • 短路属性注入 bp instanceof InstantiationAwareBeanPostProcessor / !ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)if (bp instanceof InstantiationAwareBeanPostProcessor) {
    •     InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    •     if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    •         continueWithPropertyPopulation = false;
    •         break;
    •     }
    • }
    •  
    • 属性注入,按照名称(autowireByName(beanName, mbd, bw, newPvs);)或类型(autowireByType(beanName, mbd, bw, newPvs);)注入
    • 短路if (bp instanceof InstantiationAwareBeanPostProcessor) {
    •             InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    •             pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    •             if (pvs == null) {
    •                 return;
    •             }
    • }
    •  
    • 应用属性(applyPropertyValues(beanName, mbd, bw, pvs);Spel表达式解析)
  • 初始化Bean(initializeBean(beanName, exposedObject, mbd);)
    • 执行Aware接口自动注入,包括BeanNameAware、BeanFactoryAware、BeanClassLoaderAware(invokeAwareMethods(beanName, bean);)
    • 短路bean后续BeanPostProcessor执行。postProcessBeforeInitializationresult = beanProcessor.postProcessBeforeInitialization(result, beanName);
    • if (result == null) {
    •     return result;
    • }
    •  
    • 执行init初始化方法(invokeInitMethods(beanName, wrappedBean, mbd);)
      • ((InitializingBean) bean).afterPropertiesSet();
      • invokeCustomInitMethod(beanName, bean, mbd);
    • 短路bean后续BeanPostProcessor执行。wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
    •     result = beanProcessor.postProcessAfterInitialization(result, beanName);
    •     if (result == null) {
    •         return result;
    •     }
    • }
    •  

5. 初始化依赖的Bean

6. Register bean as disposable.(registerDisposableBeanIfNecessary(beanName, bean, mbd);)

 

  • 大小: 1.9 MB
分享到:
评论

相关推荐

    Spring实例化Bean顺序

    4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...

    Spring Bean创建初始化流程.docx

    进入`doGetBean()`方法,这是Bean实例化的关键步骤。`doGetBean()`会处理Bean的依赖注入、类型检查等操作。 7. **创建Bean**: `createBean(beanName, mbd, args)`在`AbstractAutowireCapableBeanFactory`中实现...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    同时,对源码进行调试也是一个有效的排查手段,可以追踪到Bean实例化的具体位置,找出问题的根源。 综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂...

    实例化Spring bean的两种工厂方法

    在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态...在实际项目中,应根据实际情况权衡利弊,选择最适合的Bean实例化策略。

    Spring项目bean实例化代码

    本篇文章将深入探讨Spring项目中Bean的实例化过程,包括三种主要的bean实例化方式:构造方法、静态工厂和实例工厂。 首先,让我们了解什么是Bean。在Spring中,Bean是应用程序中的业务对象,它们由Spring容器负责...

    Spring bean对象实例化实现过程图解

    在 Spring 框架中,Bean 对象实例化是一个非常重要的过程,本文将详细介绍 Spring Bean 对象实例化实现过程图解,通过示例代码介绍了 Bean 对象实例化的整个过程,对大家的学习或者工作具有一定的参考学习价值。...

    详解Spring中bean实例化的三种方式

    本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这是最常见、最直观的方式,适用于大部分情况。在Spring配置文件中,我们通过`&lt;bean&gt;`...

    Spring 实例化Bean的三种方式

    ### Spring 实例化Bean的三种方式详解 在Java企业级应用开发中,Spring框架因其强大的功能和灵活性,成为了处理依赖注入、事务管理等任务的首选工具。其中,Bean的实例化是Spring框架的核心功能之一,它支持多种...

    spring bean XML配置入门

    一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...

    springBean加载过程源码解析文档,附有代码类名和行数

    SpringApplication 会从 META-INF/spring.factories 文件中获取监听器,并通过 createSpringFactoriesInstances() 方法实例化成对象返回。 2. 获取命令行参数 SpringApplication 会获取命令行参数,如 --server....

    Spring Bean 加载顺序 .

    Spring允许自定义BeanPostProcessor,它们在Bean实例化后执行特定的处理,比如AOP代理。这些后处理器将在Bean实例化后,初始化前介入。 7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括...

    Spring的三种实例化Bean的方式

    本文将详细介绍Spring中的三种主要的Bean实例化方式:XML配置、注解配置以及Java配置。 ### 1. XML配置 XML配置是Spring早期版本中最常见的Bean定义方式。在`spring_first`目录下的配置文件(如`beans.xml`)中,...

    spring 静态实例化

    这里,`useType`对象将在Spring容器初始化时被创建,并且其`getMyType`方法将返回由`test.sat.type.MyType.TypeOne`定义的Bean实例。这种方式非常灵活,适用于需要在运行时动态获取Bean的情况。 ##### 2. Java配置...

    Spring Bean简单应用实例

    这样,我们的代码不再负责查找和实例化依赖的对象,而是由Spring容器根据配置来创建和管理这些对象。IoC使得我们的代码更加灵活,易于测试和维护。 依赖注入(DI)是IoC的一种实现方式。在Spring中,DI允许我们声明...

    Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等).doc

    那么如何从 BeanDefinition 中实例化出 Bean 对象呢? BeanFactory 中 getBean 的主体思路是根据 bean 的名字和 Class 类型等来得到 bean 实例。首先,我们需要从 beanDefinitionMap 中通过 beanName 获得 Bean...

    spring bean 属性总结

    这是Spring创建Bean实例的基础。 - **id属性**:是Bean在BeanFactory中的唯一标识符,用于通过BeanFactory获取Bean实例。例如,`&lt;bean id="myBean" class="com.example.MyClass"&gt;`。 - **name属性**:类似于`id`...

    Spring bean 管理

    - 使用类构造器实例化:这是最简单的实例化方式,Spring将调用无参构造器创建Bean的实例。 - 使用静态工厂方法实例化:这种方式通过调用一个静态方法来获取Bean实例,适用于简单工厂模式。 - 使用实例工厂方法...

    Spring 延迟实例化

    3. **提高性能**:减少不必要的bean实例化,可以提高整体应用程序的性能。 #### 五、默认懒加载与全局配置 除了为每个bean单独配置`lazy-init`属性外,还可以通过`&lt;beans&gt;`元素的`default-lazy-init`属性来设置...

    Spring Bean生命周期.pdf

    整个Spring Bean的生命周期流程是:如果有Bean实现了InstantiationAwareBeanPostProcessor接口,则会在Bean实例化前后被调用。Spring容器首先对Bean进行实例化,默认情况下Bean是单例的。实例化完成后,如果有Bean...

Global site tag (gtag.js) - Google Analytics