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

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

resolveBeanClass()方法

简单流程说明:

  • 判断当前 Bean的Class有没有被加载
  • 若被加载了, 则直接返回
  • 若没有被加载,则执行 doResolveBeanClass()方法

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

doResolveBeanClass(方法)

流程简单说明:

  • 获取类加载器
  • 注意, 这边我们传进来的 typesToMatch 是null, 所以这个if我们暂时忽略掉
  • 获取bean类型名称
  • 解析Spring表达式

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

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

实例化前(后面有讲)

从这里开始具体的流程分析放到下面的大标题去讲解了, 因为我觉得具体的一个流程应该是在一个大标题下面的

doCreateBean()方法

简单流程说明:

  • 实例化Bean
  • 解决循环依赖
  • 填充属性
  • 初始化
  • Bean的销毁

具体代码如下图所示, 一张图放不下....

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

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

由于 doCreateBean()方法内部是比较重要的, 所以我把这个方法拆解成了多个方法, 放在了下面的大标题写

四、实例化前

实例化前的的方法是 resolveBeforeInstantiation()方法, 具体进入实例化前的方法步骤请看上一个标题

设置初始化前要去使用类实现 BeanPostProcessor类, 并实现其内部的两个方法

该方法内部具体的实现如下所示

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

实例化前的方法执行完毕之后, 就会进入到 doCreateBean()方法

五、属性填充(@Bean方式)

代码如下

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

这里传进该方法的第三个参数是 bean的实例, bean实例的创建是在 doCreateBean方法中, 具体如下图所示, 正常来讲, 我们已经进行了实例化, 所以这个值是肯定存在的

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

接着往下走, 会看到一个 mbd.isSynthetic()判断, 这个也后面讲, 然后就看到了hasInstantiationAwareBeanPostProcessors() 这个方法判断, 有没有执行这个BeanPostProcessors

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

六、实例化后

这个很少能用到了, 就暂时不做讲解了, 感兴趣的可以自己去看一下

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

它的配置是在 @Bean注解上写成以下形式, 我们也可以看到, 现在已经不推荐我们使用这个方式去做注解了

@Bean(autowire = Autowire.BY_TYPE)
public void test(){
}
复制代码

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

处理属性(@Autowired等注解)

再一次的去判断有没有实现 InstantiationAwareBeanPostProcessor 接口, 如果有的话就遍历去执行 postProcessProperties方法, 这个方法还是很重要的, 在Spring中, 是通过这个扩展点来处理@Autowired, @Resource等注解的

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

这个方法具体的实现, 我们通过以下方式进入, 通过 InstantiationAwareBeanPostProcessor类找到 postProcessProperties方法, 然后去看具体的实现类 AutowiredAnnotationBeanPostProcessor

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

实现的 postProcessProperties方法如下图所示, 这个后续也会讲到

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

初始化

我们回到 doCreateBean方法, 接着往下看初始化方法

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

该方法详情如下图所示:

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

Aware

可以看到最开始的核心就是调用了一个方法 invokeAwareMethods(beanName, bean);

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

下图是这个方法详情, 就不想洗讲了, 大概都能看的懂:

  • 判断有没有实现 Aware接口
  • BeanNameAware:回传beanName给bean对象。
  • BeanClassLoaderAware:回传classLoader给bean对象。
  • BeanFactoryAware:回传beanFactory给对象。

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

初始化前

初始化简单流程说明:

  • 循环遍历 BeanPostProcessors
  • 执行相应的方法

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

初始化

初始化简单流程说明:

  • 判断有没有实现 InitializingBean
  • 实现了调用 ((InitializingBean) bean).afterPropertiesSet();方法
  • 如果 BeanDefinition指定了 InitMethodName(初始化方法的名字)
  • 就执行对应的方法

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

初始化后(AOP)

初始化简单流程说明:

  • 循环遍历 BeanPostProcessors
  • 执行相应的方法

和初始化前的区别就是执行的方法换了

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


目录
相关文章
|
1天前
|
Java 应用服务中间件 Spring
Spring系列文章:Bean的作⽤域
Spring系列文章:Bean的作⽤域
|
1天前
|
XML 前端开发 Java
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
4 0
|
1天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
2 0
|
1天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
5 0
|
1天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
1天前
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
10 1
|
1天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
21 1
|
1天前
|
XML Java 数据格式
Spring Bean
【4月更文挑战第30天】Spring Bean
17 0
|
1天前
|
前端开发 Java 数据格式
【Spring系列笔记】定义Bean的方式
在Spring Boot应用程序中,定义Bean是非常常见的操作,它是构建应用程序的基础。Spring Boot提供了多种方式来定义Bean,每种方式都有其适用的场景和优势。
32 2
|
1天前
|
XML Java 数据格式
谈谈 Spring 中 Bean 的生命周期?
谈谈 Spring 中 Bean 的生命周期?
20 1