Spring之Bean生命周期源码分析(一)2

简介: Spring之Bean生命周期源码分析(一)

当前 BeanDefinition不存在 父BeanDefinition

在红框位置去判断 当前bean有没有父bean, 如果没有, 则判断当前 BeanDefinition有没有实例化 RootBeanDefinition, 然后去生成一个新的 RootBeanDefinition, 不管有没有实例化都生成

父子BeanDefinition具体可以看标题三, 如下图所示

网络异常,图片无法展示
|

最后会直接进入这个方法, 将当前 BeanDefinition放入 mergedBeanDefinitions 中

网络异常,图片无法展示
|

当前 BeanDefinition存在 父BeanDefinition

流程如下:

  • 获取当前 BeanDefinition 的 父BeanDefinition名字
  • 判断当前 beanName是否等于 parentBeanName
  • 不相等:
  • 递归 继续进行合并
  • 相等:
  • 获取 父BeanFactory
  • 如果 父Bean工厂 实现了 ConfigurableBeanFactory 接口则 递归合并
  • 若未实现则抛出异常

网络异常,图片无法展示
|

FactoryBean

这边会通过 beanName去判断当前 bean是不是一个 FactoryBean, 具体实现如下图所示

在 isFactoryBean(String name) 方法中, 第一行代码的降价在下面 FactoryBean标题下面

网络异常,图片无法展示
|

上图中, 我特意用红框圈出来一个方法, 这个方法的作用是: 通过 beanName去单例池中取数据, 但是这个时候是获取不到的, 因为我们还没有去生成 bean对象, 所以继续往下走

在下面代码中, 去做判断, 如果当前 beanName去取不到 BeanDefinition, 就去判断它的 父BeanDefinition有没有实现 FactoryBean

if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {
   return ((ConfigurableBeanFactory) getParentBeanFactory()).isFactoryBean(name);
}
复制代码

最后, 拿到合并之后的 BeanDefinition, 在往下走, 去判断 BeanDefinition的类型, 在判断是不是一个 FactoryBean, 在返回

网络异常,图片无法展示
|

获取FactoryBean对象

获取FactoryBean对象靠的是 getBean(String name)方法

网络异常,图片无法展示
|

我们可以看到, 这个方法的入参是在我们的 beanName前面增加了一个符号 &

我们进入这个方法内部去看一下

网络异常,图片无法展示
|

这里我们看到了熟悉的代码, 这行代码会根据你传入的 name不同而有所变化

String beanName = transformedBeanName(name);
复制代码

网络异常,图片无法展示
|

如上图所示, 可以看到, 我们在 实例化非懒加载单例Bean的时候, 有三个地方调用到了 getBean(String name)方法, 且第一次调用在 beanName前加了符号 &

在 getBean(String name)中, 会通过 transformedBeanName 方法去获取 beanName

然后根据获取到的 beanName去单例池中查找 获取单例对象, 如果获取到了单例对象, 那么会根据 bean的单例对象, beanName和传进来的 name去获取 bean实例

如果没有获取到了单例对象, 则会继续进行 bean的生命周期, 最后生成 bean的单例对象, 具体可以看我的下一篇Spring文章

创建 Bean对象

创建Bean对象就要用到 getBean(String beanName)方法了, 对于 getBean(String beanName) 方法的源码解析, 将作为下篇Spring系列文章发布在我的: Spring专栏

getBean 方法就是去创建一个Bean对象, 之前我还简单的手写模拟过整个过程, 感兴趣的可以去看一下Spring之手写模拟Spring Bean的创建

实现SmartInitializingSingleton接口

我们来实现这个接口, 会自动生成一个方法

网络异常,图片无法展示
|

通过上面的分析, 可以知道, 这个方法的执行时间是: 所有单例Bean都实例化之后

因为是在所有Bean实例化之后才去判断当前的Bean有没有实现这个接口

网络异常,图片无法展示
|

三、合成BeanDefinition-父子BeanDefinition

生成父子 BeanDefinition代码如下

<bean id="juejin1" class="com.ningxuan.service.Juejin" scope="prototype"/>
<bean id="juejin2" class="com.ningxuan.service.Juejin" parent="juejin1"/>
复制代码

网络异常,图片无法展示
|

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

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


目录
相关文章
|
15天前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
42 1
|
22天前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
2月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
75 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
31 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
28 1
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
2月前
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细解析Spring Bean的生命周期及其核心概念,并深入源码分析。Spring Bean是Spring框架的核心,由容器管理其生命周期。从实例化到销毁,共经历十个阶段,包括属性赋值、接口回调、初始化及销毁等。通过剖析`BeanFactory`、`ApplicationContext`等关键接口与类,帮助你深入了解Spring Bean的管理机制。希望本文能助你更好地掌握Spring Bean生命周期。
96 1
|
29天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
22 0
|
2月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
45 1
|
6月前
|
Java 开发者 Spring
解析Spring中Bean的生命周期
解析Spring中Bean的生命周期
58 2