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);)
相关推荐
4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...
进入`doGetBean()`方法,这是Bean实例化的关键步骤。`doGetBean()`会处理Bean的依赖注入、类型检查等操作。 7. **创建Bean**: `createBean(beanName, mbd, args)`在`AbstractAutowireCapableBeanFactory`中实现...
同时,对源码进行调试也是一个有效的排查手段,可以追踪到Bean实例化的具体位置,找出问题的根源。 综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂...
在Spring框架中,bean的实例化是其核心功能之一,它允许我们管理应用程序中的对象生命周期。本篇将详细探讨两种工厂方法——实例工厂方法和静态...在实际项目中,应根据实际情况权衡利弊,选择最适合的Bean实例化策略。
本篇文章将深入探讨Spring项目中Bean的实例化过程,包括三种主要的bean实例化方式:构造方法、静态工厂和实例工厂。 首先,让我们了解什么是Bean。在Spring中,Bean是应用程序中的业务对象,它们由Spring容器负责...
在 Spring 框架中,Bean 对象实例化是一个非常重要的过程,本文将详细介绍 Spring Bean 对象实例化实现过程图解,通过示例代码介绍了 Bean 对象实例化的整个过程,对大家的学习或者工作具有一定的参考学习价值。...
本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这是最常见、最直观的方式,适用于大部分情况。在Spring配置文件中,我们通过`<bean>`...
### Spring 实例化Bean的三种方式详解 在Java企业级应用开发中,Spring框架因其强大的功能和灵活性,成为了处理依赖注入、事务管理等任务的首选工具。其中,Bean的实例化是Spring框架的核心功能之一,它支持多种...
一旦XML配置加载到Spring容器中,容器将根据配置创建Bean实例,并按照定义进行初始化、依赖注入,最后完成Bean的生命周期管理。 10. **实践操作**: 在实际开发中,我们可以使用Eclipse的Spring插件来简化Bean...
SpringApplication 会从 META-INF/spring.factories 文件中获取监听器,并通过 createSpringFactoriesInstances() 方法实例化成对象返回。 2. 获取命令行参数 SpringApplication 会获取命令行参数,如 --server....
Spring允许自定义BeanPostProcessor,它们在Bean实例化后执行特定的处理,比如AOP代理。这些后处理器将在Bean实例化后,初始化前介入。 7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括...
本文将详细介绍Spring中的三种主要的Bean实例化方式:XML配置、注解配置以及Java配置。 ### 1. XML配置 XML配置是Spring早期版本中最常见的Bean定义方式。在`spring_first`目录下的配置文件(如`beans.xml`)中,...
这里,`useType`对象将在Spring容器初始化时被创建,并且其`getMyType`方法将返回由`test.sat.type.MyType.TypeOne`定义的Bean实例。这种方式非常灵活,适用于需要在运行时动态获取Bean的情况。 ##### 2. Java配置...
这样,我们的代码不再负责查找和实例化依赖的对象,而是由Spring容器根据配置来创建和管理这些对象。IoC使得我们的代码更加灵活,易于测试和维护。 依赖注入(DI)是IoC的一种实现方式。在Spring中,DI允许我们声明...
那么如何从 BeanDefinition 中实例化出 Bean 对象呢? BeanFactory 中 getBean 的主体思路是根据 bean 的名字和 Class 类型等来得到 bean 实例。首先,我们需要从 beanDefinitionMap 中通过 beanName 获得 Bean...
这是Spring创建Bean实例的基础。 - **id属性**:是Bean在BeanFactory中的唯一标识符,用于通过BeanFactory获取Bean实例。例如,`<bean id="myBean" class="com.example.MyClass">`。 - **name属性**:类似于`id`...
- 使用类构造器实例化:这是最简单的实例化方式,Spring将调用无参构造器创建Bean的实例。 - 使用静态工厂方法实例化:这种方式通过调用一个静态方法来获取Bean实例,适用于简单工厂模式。 - 使用实例工厂方法...
3. **提高性能**:减少不必要的bean实例化,可以提高整体应用程序的性能。 #### 五、默认懒加载与全局配置 除了为每个bean单独配置`lazy-init`属性外,还可以通过`<beans>`元素的`default-lazy-init`属性来设置...
整个Spring Bean的生命周期流程是:如果有Bean实现了InstantiationAwareBeanPostProcessor接口,则会在Bean实例化前后被调用。Spring容器首先对Bean进行实例化,默认情况下Bean是单例的。实例化完成后,如果有Bean...