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。


目录
相关文章
|
2月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
21天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
21天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
119 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
8天前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
8天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
2月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
2月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
2月前
|
Java Spring
|
2月前
|
前端开发 Java 开发者
|
8天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
下一篇
无影云桌面