Spring之Bean生命周期源码解析

Spring Bean生命周期源码详解 之后child需要根据BeanDefinition来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的BeanDefinition,也就是RootBeanDefinition。我们知道BeanPostProcessor接口的作用是在bean初始化前和初始化后执行一些方法,Spring提供了该接口的子接口来进行实例化前后执行的一些方法。可以在这个步骤中,对Bean最终进行处理,Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象。 阅读详情

Bean的生成过程

1. 生成BeanDefinition

Spring启动的时候会进行扫描,会先调用

org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage)


扫描某个包路径,并得到BeanDefinition的Set集合。
​

关于Spring启动流程,后续会单独的课详细讲,这里先讲一下Spring扫描的底层实现:
​

Spring扫描底层流程:Spring扫描底层流程| ProcessOn免费在线作图,在线流程图,在线思维导图
​

  1. 首先,通过ResourcePatternResolver获得指定包路径下的所有.class文件(Spring源码中将此文件包装成了Resource对象)
  2. 遍历每个Resource对象
  3. 利用MetadataReaderFactory解析Resource对象得到MetadataReader(在Spring源码中MetadataReaderFactory具体的实现类为CachingMetadataReaderFactory,MetadataReader的具体实现类为SimpleMetadataReader)
  4. 利用MetadataReader进行excludeFilters和includeFilters,以及条件注解@Conditional的筛选(条件注解并不能理解:某个类上是否存在@Conditional注解,如果存在则调用注解中所指定的类的match方法进行匹配,匹配成功则通过筛选,匹配失败则pass掉。)
  5. 筛选通过后,基于metadataReader生成ScannedGenericBeanDefinition
  6. 再基于metadataReader判断是不是对应的类是不是接口或抽象类
  7. 如果筛选通过,那么就表示扫描到了一个Bean,将ScannedGenericBeanDefinition加入结果集

​

MetadataReader表示类的元数据读取器,主要包含了一个AnnotationMetadata,功能有

  1. 获取类的名字、
  2. 获取父类的名字
  3. 获取所实现的所有接口名
  4. 获取所有内部类的名字
  5. 判断是不是抽象类
  6. 判断是不是接口
  7. 判断是不是一个注解
  8. 获取拥有某个注解的方法集合
  9. 获取类上添加的所有注解信息
  10. 获取类上添加的所有注解类型集合

值得注意的是,CachingMetadataReaderFactory解析某个.class文件得到MetadataReader对象是利用的ASM技术,并没有加载这个类到JVM。并且,最终得到的ScannedGenericBeanDefinition对象,beanClass属性存储的是当前类的名字,而不是class对象。(beanClass属性的类型是Object,它即可以存储类的名字,也可以存储class对象)
​

最后,上面是说的通过扫描得到BeanDefinition对象,我们还可以通过直接定义BeanDefinition,或解析spring.xml文件的<bean/>,或者@Bean注解得到BeanDefinition对象。(后续课程会分析@Bean注解是怎么生成BeanDefinition的)。

2. 合并BeanDefinition

​

通过扫描得到所有BeanDefinition之后,就可以根据BeanDefinition创建Bean对象了,但是在Spring中支持父子BeanDefinition,和Java父子类类似,但是完全不是一回事。

父子BeanDefinition实际用的比较少,使用是这样的,比如:

<bean id="parent" class="com.memory.service.Parent" scope="prototype"/>
<bean id="child" class="com.memory.service.Child"/>

这么定义的情况下,child是单例Bean。

<bean id="parent" class="com.memory.service.Parent" scope="prototype"/>
<bean id="child" class="com.memory.service.Child" parent="parent"/>

但是这么定义的情况下,child就是原型Bean了。
​

因为child的父BeanDefinition是parent,所以会继承parent上所定义的scope属性。
​

而在根据child来生成Bean对象之前,需要进行BeanDefinition的合并,得到完整的child的BeanDefinition。
​

3. 加载类

BeanDefinition合并之后,就可以去创建Bean对象了,而创建Bean就必须实例化对象,而实例化就必须先加载当前BeanDefinition所对应的class,在AbstractAutowireCapableBeanFactory类的createBean()方法中,一开始就会调用:

Class<?> resolvedClass = resolveBeanClass(mbd, beanName);

这行代码就是去加载类,该方法是这么实现的:

if (mbd.hasBeanClass()) {
 return mbd.getBeanClass();
}
if (System.getSecurityManager() != null) {
 return AccessController.doPrivileged((PrivilegedExceptionAction<Class<?>>) () ->
  doResolveBeanClass(mbd, typesToMatch), getAccessControlContext());
 }
else {
 return doResolveBeanClass(mbd, typesToMatch);
}
public boolean hasBeanClass() {
 return (this.beanClass instanceof Class);
}

如果beanClass属性的类型是Class,那么就直接返回,如果不是,则会根据类名进行加载(doResolveBeanClass方法所做的事情)

会利用BeanFactory所设置的类加载器来加载类,如果没有设置,则默认使用**ClassUtils.getDefaultClassLoader()**所返回的类加载器来加载。

ClassUtils.getDefaultClassLoader()
  1. 优先返回当前线程中的ClassLoader
  2. 线程中类加载器为null的情况下,返回ClassUtils类的类加载器
  3. 如果ClassUtils类的类加载器为空,那么则表示是Bootstrap类加载器加载的ClassUtils类,那么则返回系统类加载器

4. 实例化前

当前BeanDefinition对应的类成功加载后,就可以实例化对象了,但是...
​

在Spring中,实例化对象之前,Spring提供了一个扩展点,允许用户来控制是否在某个或某些Bean实例化之前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()。比如:
​

@Component
public class MemoryBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

 @Override
 public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  if ("userService".equals(beanName)) {
   System.out.println("实例化前");
  }
  return null;
 }
}

如上代码会导致,在userService这个Bean实例化前,会进行打印。
​

值得注意的是,postProcessBeforeInstantiation()是有返回值的,如果这么实现:

@Component
public class MemoryBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

 @Override
 public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
  if ("userService".equals(beanName)) {
   System.out.println("实例化前");
   return new UserService();
  }
  return null;
 }
}

​

userService这个Bean,在实例化前会直接返回一个由我们所定义的UserService对象。如果是这样,表示不需要Spring来实例化了,并且后续的Spring依赖注入也不会进行了,会跳过一些步骤,直接执行初始化后这一步。

5. 实例化

在这个步骤中就会根据BeanDefinition去创建一个对象了。

5.1 Supplier创建对象

首先判断BeanDefinition中是否设置了Supplier,如果设置了则调用Supplier的get()得到对象。
​

得直接使用BeanDefinition对象来设置Supplier,比如:

AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setInstanceSupplier(new Supplier<Object>() {
 @Override
 public Object get() {
  return new UserService();
 }
});
context.registerBeanDefinition("userService", beanDefinition);

5.2 工厂方法创建对象

如果没有设置Supplier,则检查BeanDefinition中是否设置了factoryMethod,也就是工厂方法,有两种方式可以设置factoryMethod,比如:
​

方式一:

<bean id="userService" class="com.memory.service.UserService" factory-method="createUserService" />

对应的UserService类为:

public class UserService {

 public static UserService createUserService() {
  System.out.println("执行createUserService()");
  UserService userService = new UserService();
  return userService;
 }

 public void test() {
  System.out.println("test");
 }

}

方式二:

<bean id="commonService" class="com.Memory.service.CommonService"/>
<bean id="userService1" factory-bean="commonService" factory-method="createUserService" />

对应的CommonService的类为:

public class CommonService {

 public UserService createUserService() {
  return new UserService();
 }
}

​

Spring发现当前BeanDefinition方法设置了工厂方法后,就会区分这两种方式,然后调用工厂方法得到对象。
​

值得注意的是,我们通过@Bean所定义的BeanDefinition,是存在factoryMethod和factoryBean的,也就是和上面的方式二非常类似,@Bean所注解的方法就是factoryMethod,AppConfig对象就是factoryBean。如果@Bean所所注解的方法是static的,那么对应的就是方式一。

5.3 推断构造方法

第一节已经讲过一遍大概原理了,后面有一节课单独分析源码实现。推断完构造方法后,就会使用构造方法来进行实例化了。
​

额外的,在推断构造方法逻辑中除开会去选择构造方法以及查找入参对象意外,会还判断是否在对应的类中是否存在使用**@Lookup注解**了方法。如果存在则把该方法封装为LookupOverride对象并添加到BeanDefinition中。
​

在实例化时,如果判断出来当前BeanDefinition中没有LookupOverride,那就直接用构造方法反射得到一个实例对象。如果存在LookupOverride对象,也就是类中存在@Lookup注解了的方法,那就会生成一个代理对象。
​

@Lookup注解就是方法注入,使用demo如下:

@Component
public class UserService {

 private OrderService orderService;

 public void test() {
  OrderService orderService = createOrderService();
  System.out.println(orderService);
 }

 @Lookup("orderService")
 public OrderService createOrderService() {
  return null;
 }

}

6. BeanDefinition的后置处理

Bean对象实例化出来之后,接下来就应该给对象的属性赋值了。在真正给属性赋值之前,Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(),可以对此时的BeanDefinition进行加工,比如:

@Component
public class MemoryMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {

 @Override
 public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
  if ("userService".equals(beanName)) {
   beanDefinition.getPropertyValues().add("orderService", new OrderService());
  }
 }
}

​

在Spring源码中,AutowiredAnnotationBeanPostProcessor就是一个MergedBeanDefinitionPostProcessor,它的postProcessMergedBeanDefinition()中会去查找注入点,并缓存在AutowiredAnnotationBeanPostProcessor对象的一个Map中(injectionMetadataCache)。

7. 实例化后

在处理完BeanDefinition后,Spring又设计了一个扩展点:InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(),比如:
​

@Component
public class MemoryInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

 @Override
 public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {

  if ("userService".equals(beanName)) {
   UserService userService = (UserService) bean;
   userService.test();
  }

  return true;
 }
}

上述代码就是对userService所实例化出来的对象进行处理。
​

这个扩展点,在Spring源码中基本没有怎么使用。

8. 自动注入

这里的自动注入指的是Spring的自动注入,后续依赖注入课程中单独讲
​

9. 处理属性

这个步骤中,就会处理@Autowired、@Resource、@Value等注解,也是通过**InstantiationAwareBeanPostProcessor.postProcessProperties()**扩展点来实现的,比如我们甚至可以实现一个自己的自动注入功能,比如:

@Component
public class MemoryInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

 @Override
 public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
  if ("userService".equals(beanName)) {
   for (Field field : bean.getClass().getFields()) {
    if (field.isAnnotationPresent(MemoryInject.class)) {
     field.setAccessible(true);
     try {
      field.set(bean, "123");
     } catch (IllegalAccessException e) {
      e.printStackTrace();
     }
    }
   }
  }

  return pvs;
 }
}

关于@Autowired、@Resource、@Value的底层源码,会在后续的依赖注入课程中详解。

10. 执行Aware

完成了属性赋值之后,Spring会执行一些回调,包括:

  1. BeanNameAware:回传beanName给bean对象。
  2. BeanClassLoaderAware:回传classLoader给bean对象。
  3. BeanFactoryAware:回传beanFactory给对象。

11. 初始化前

初始化前,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessBeforeInitialization(),比如

@Component
public class MemoryBeanPostProcessor implements BeanPostProcessor {

 @Override
 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  if ("userService".equals(beanName)) {
   System.out.println("初始化前");
  }

  return bean;
 }
}

利用初始化前,可以对进行了依赖注入的Bean进行处理。
​

在Spring源码中:

  1. InitDestroyAnnotationBeanPostProcessor会在初始化前这个步骤中执行@PostConstruct的方法,
  2. ApplicationContextAwareProcessor会在初始化前这个步骤中进行其他Aware的回调:
    1. EnvironmentAware:回传环境变量
    2. EmbeddedValueResolverAware:回传占位符解析器
    3. ResourceLoaderAware:回传资源加载器
    4. ApplicationEventPublisherAware:回传事件发布器
    5. MessageSourceAware:回传国际化资源
    6. ApplicationStartupAware:回传应用其他监听对象,可忽略
    7. ApplicationContextAware:回传Spring容器ApplicationContext

12. 初始化

  1. 查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调用其afterPropertiesSet()方法
  2. 执行BeanDefinition中指定的初始化方法

13. 初始化后

这是Bean创建生命周期中的最后一个步骤,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessAfterInitialization(),比如:

@Component
public class MemoryBeanPostProcessor implements BeanPostProcessor {

 @Override
 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  if ("userService".equals(beanName)) {
   System.out.println("初始化后");
  }

  return bean;
 }
}

可以在这个步骤中,对Bean最终进行处理,Spring中的AOP就是基于初始化后实现的,初始化后返回的对象才是最终的Bean对象。

总结BeanPostProcessor

  1. InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()
  2. 实例化
  3. MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()
  4. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()
  5. 自动注入
  6. InstantiationAwareBeanPostProcessor.postProcessProperties()
  7. Aware对象
  8. BeanPostProcessor.postProcessBeforeInitialization()
  9. 初始化
  10. BeanPostProcessor.postProcessAfterInitialization()
Spring之Bean生命周期源码解析(一) Spring之Bean生命周期源码解析(一) Bean生命周期流程 Bean包扫描底层流程 MetadataReader 合并BeanDefinition 加载类 什么是Bean的生命周期 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的 Bean生命周期流程图 Bean的生命周期: 启动ApplicationContext 创建BeanFactory 初始化BeanFactory 在BeanFactory后置处理:在这里会进行包扫描,找. 阅读详情

相关推荐

Cadence Allegro 17.4学习记录开始02-原理图Capture CIS 17.4

Allegro的第一方网表与第三方网表有以下几个区别点;Ø 与Allegro实现交互式操作的是第一方网表,第三方网表时不可以实现交互式操作;Ø 第三方网表不能将器件的Value属性导入到PCB中,输出时以封装属性来代替Value属性,第一方网表是可以的;Ø 网表导入到PCB中时,第三方的网表需要指定事先指定好PCB封装库文件,并产生Device文件,才可以将网表导入到PCB中,第一方网表则可以直接导入。

qq_31444421的博客 1万+

Spring Bean生命周期源码篇

本文深入解析了Spring框架的核心原理,主要涵盖Bean生命周期、依赖注入、AOP实现和循环依赖处理机制。文章详细介绍了Bean的创建过程:从类加载、构造方法推断、依赖注入到初始化阶段,并重点分析了AOP的实现原理和事务管理机制。针对循环依赖问题,文章阐述了三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)的解决方案。此外,还通过手写模拟代码展示了Spring底层工作机制,包括注解扫描、Bean创建、依赖注入和AOP代理等核心流程

qq_43649937的博客 2302

深入浅出卡尔曼滤波器算法

深入浅出讲解卡尔曼滤波器的工作原理及其公式推导,讨论卡尔曼滤波器的核心公式所代表的意义及个人的理解。

m0_37835056的博客 1365

spring源码篇(三)bean的生命周期

人人都说spring是bean容器,也正体现了Bean的生命周期在spring中是至关重要的存在。我用思维导图把上面的流程捋了一遍。深色的就是上面的各个步骤,偏绿色,和绿色的是后置处理器的部分,一共6次调用,就是说我们有6次机会修改bean,还每一算上填充属性里的后置处理器。深蓝色和蓝绿色的是上面的生命周期阶段;绿色字体和蓝绿色的是后置处理器处理的调用;蓝色字体的是可以自定义实现的bean初始化的地方;那么还是围绕问题回顾一下为什么要有beanDefinition。

用针戳左手中指指头的博客 1307

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6026

Verilog仿真必备:FSDB dump命令全解析与实战配置指南

本文深入解析了Verilog仿真中FSDB波形记录的核心命令与实战配置技巧。针对大规模SoC验证场景,详细介绍了如何通过$fsdbDumpvars、$fsdbDumpfile等命令实现信号精准捕获、文件体积控制和动态启停,并提供了智能化的分层dump策略,帮助工程师在保证调试信息完整性的同时,大幅提升验证效率并有效管理波形数据。

cnn8visionary的博客 348

SpringBean 生命周期源码解析

前言 Spring 作为当前 Java 最流行、最强大的轻量级框架,受到了程序员的青睐。准确的了解 Spring Bean 的生命周期是非常必要的,Spring Bean 的生命周期是 Spring 面试热点问题,想要答好并不容易!本文将从源码的角度入手,帮助小伙伴彻底掌握 Spring Bean 的生命周期。 而 Spring Bean 的生命周期只有 4 个阶段: 主要逻辑都在 doCreateBean 方法(AbstractAutowireCapableBeanFactory类中,逻辑很清晰,就是顺

养歌的博客 1491

修改Avaya IP-Office电话交换机出厂自带的提示语音内容

1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话

qlin4cn的博客 4919

spring bean生命周期源码剖析

spring bean生命周期记不住?看完这篇源码剖析就会了,根本不用背诵

stay_the_course的博客 2958

31、贝叶斯认知建模与隐马尔可夫模型:理论与应用

本文探讨了贝叶斯认知建模与隐马尔可夫模型(HMM)的理论基础及其在认知科学和神经科学中的应用。重点介绍了贝叶斯定理和HMM的基本原理,并结合实际案例,如情绪识别系统和脑机接口(BCI),展示了它们在处理复杂认知任务中的强大能力。文章还讨论了贝叶斯-HMM模型的技术细节、优势与局限性,以及未来的发展前景。

meat5的博客 141

手把手教你从入门到精通C# Modbus通信

本文是《Modbus通信从入门到精通》的导读,本专栏将会详细介绍ModusRTU 、ModbusASCII、ModbusTCP这三种协议的C#实现,由一个高级工程师多年实战经验总结而成,绝对干货!

qq_34059233的博客 1万+

架构师集合之Spring的Bean的生命周期以及源码解析

Spring的Bean的生命周期以及源码 BeanFactoryPostProcess,BeanPostProcess postProcessBeanFactory,InstantiationAwareBeanPostProcessor createBeanInstance,initializeBean,BeanNameAware,BeanFactoryAware, postProcessBe

小明程序猿 505

生成mm grounding dino的onnx模型并在x-anylabeling中使用

X-AnyLabeling 是一款cvhub开发的交互式自动标注工具,其基于AnyLabeling进行构建和二次开发,在此基础上扩展并支持了许多的模型和功能,并借助Segment Anything和YOLO等主流模型提供强大的 AI 支持。其最新版基于grounding dino可以实现开放词汇检测及生成掩码。2024年,MMDet 3.3.0提出了 MM-Grounding-DINO。

blanokvaffy的博客 1729

Spring源码解析之bean的生命周期

spring源码之bean的生命周期创建

qq_40239169的博客 331

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring Bean的完整生命周期源码解析(从容器创建到Bean的销毁)

Spring Bean的完整生命周期源码解析(从容器创建到Bean的销毁)

FebruaryQ的博客 1308

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

完整Spring Bean的生命周期源码解析

结合源码及测试代码分析Spring Bean的完整生命周期。

qqxhb 资源共享 925

Spring框架之Bean生命周期源码解析

BeanDefinition合并之后,就可以去创建Bean对象了,而创建Bean就必须实例化对象,而实例化就 必须先加载当前BeanDefinition所对应的class,在AbstractAutowireCapableBeanFactory类的。(doResolveBeanClass方法所做的事情) 会利用BeanFactory所设置的类加载器来加载类,如果没有设置,则默认使用 **ClassUtils.getDefaultClassLoader()**所返回的类加载器来加载。

2301_79454275的博客 1135

Spring之Bean生命周期源码解析(上)

Spring之Bean生命周期源码解析

深入Java世界:探索编程之美与技术深度 286

Spring Bean的生命周期源码解析

主要讲解了spring Bean的生命周期的从头到尾做了那些事情,以及包含的所有扩展点

大尾巴狼学编程的博客 2280

Spring深度学习:Bean生命周期及源码解析

本文小豪将带大家深度学习Spring Bean相关知识,包括Bean的生命周期及Bean创建过程的底层源码,学习过程中不仅仅是了解Spring Bean的工作原理,更重要的是学会理解框架的底层逻辑,从而提升我们的思维能力。

Code豪客 2039

Spring Bean生命周期源码深度解析

本文详细解析了Spring Bean的生命周期全过程,涵盖从创建到销毁的完整流程。主要内容包括:1. Bean的生成过程,包括扫描解析、元数据处理、实例化前扩展点、三种实例化方式等关键环节;2. Bean的初始化流程,详细介绍了属性注入、Aware接口回调、初始化前后扩展点等步骤;3. Bean的销毁机制,分析了多种销毁方式的适配处理;4. 生命周期中的设计模式应用,如模板方法、策略模式等;5. 性能优化建议和常见问题解决方案。文章通过流程图和代码示例,系统性地展示了Spring容器管理Bean的完整生命周

alonewolf_99的博客 1266

Spring之Bean生命周期源码解析(上)

点击查看流程图> beanClass, String beanName) throws BeansException { if ("userService".equals(beanName)) { System.out.println("实例化前");// 自定义返回对象 } return null;@Autowired@Resource@Value的底层源码将在后续课程详解。实例化自动注入Aware 回调初始化。

weixin_44431458的博客 313

【源码解析】Spring Bean生命周期源码解析

【源码解析】Spring Bean生命周期源码解析

秋装什么的博客 803

Spring源码之Bean的生命周期-Bean的销毁源码解析

Spring 源码之bean的生命周期之bean的销毁

qq_40239169的博客 766
上一篇: 深入理解云原生技术:构建现代化可靠的应用
下一篇: AQS应用之BlockingQueue详解
Memory_2020
Memory_2020 新星创作者: Java技术领域 新星创作者: Java技术领域
博客等级 码龄10年 5600粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memory_2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值