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
  • 执行相应的方法

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

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


目录
相关文章
|
20天前
|
XML 安全 Java
|
1月前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
57 1
|
3天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
20 6
|
5天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
33 3
|
1月前
|
缓存 Java Spring
实战指南:四种调整 Spring Bean 初始化顺序的方案
本文探讨了如何调整 Spring Boot 中 Bean 的初始化顺序,以满足业务需求。文章通过四种方案进行了详细分析: 1. **方案一 (@Order)**:通过 `@Order` 注解设置 Bean 的初始化顺序,但发现 `@PostConstruct` 会影响顺序。 2. **方案二 (SmartInitializingSingleton)**:在所有单例 Bean 初始化后执行额外的初始化工作,但无法精确控制特定 Bean 的顺序。 3. **方案三 (@DependsOn)**:通过 `@DependsOn` 注解指定 Bean 之间的依赖关系,成功实现顺序控制,但耦合性较高。
实战指南:四种调整 Spring Bean 初始化顺序的方案
|
18天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
28 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
34 1
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
34 1
|
2月前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
1月前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
28 0