spring容器中Bean生命周期

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: bean的生命周期指的是从对象创建到对象销毁的过程。

bean的生命周期指的是从对象创建到对象销毁的过程。

一、生命周期阶段

(一)生命周期流程图

(一)实例化bean

  1. 调用bean的无参构造函数实例化bean对象

(二)属性赋值

  1. 为bean的属性赋值和对其它bean进行引用(调用bean的set方法)

(三)初始化bean

  1. 检查Aware的相关接口并设置相关依赖;
  2. 是否自定义类实现BeanPostProcessor接口,如果有则调用前置处理方法postProcessBeforeInitialization;
  3. 判断是否实现InitializingBean接口,如果实现此接口,Spring将调用他们的afterPropertiesSet()方法;
  4. 判断是否配置自定义的inint-method方法;
  5. 调用BeanPostProcessor后置处理方法postProcessAfterInitialization方法;
  6. 此时,Bean已经准备就绪,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到应用上下文被销毁。

(四)容器关闭销毁bean

  1. 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法,同样,如果bean使用了destory-method 声明销毁方法,该方法也会被调用。

二、相关扩展点

(一)Aware 接口

若 Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的 Spring 容器资源

Spring 中提供的 Aware 接口有:

  1. BeanNameAware:注入当前 bean 对应 beanName;
  2. BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader;
  3. BeanFactoryAware:注入 当前BeanFactory容器 的引用。

源代码如下所示:

// AbstractAutowireCapableBeanFactory.javaprivatevoidinvokeAwareMethods(finalStringbeanName, finalObjectbean) {
if (beaninstanceofAware) {
if (beaninstanceofBeanNameAware) {
            ((BeanNameAware) bean).setBeanName(beanName);
        }
if (beaninstanceofBeanClassLoaderAware) {
            ((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
        }
if (beaninstanceofBeanFactoryAware) {
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}

(二)BeanPostProcessor

BeanPostProcessor 是 Spring 为修改 bean提供的强大扩展点,其可作用于容器中所有 bean,其定义如下:

publicinterfaceBeanPostProcessor {
// 初始化前置处理defaultObjectpostProcessBeforeInitialization(Objectbean, StringbeanName) throwsBeansException {
returnbean;
 }
// 初始化后置处理defaultObjectpostProcessAfterInitialization(Objectbean, StringbeanName) throwsBeansException {
returnbean;
 }
}


(三)InitializingBean 和 init-method

InitializingBean 和 init-method 是 Spring 为bean 初始化提供的扩展点。

InitializingBean接口 的定义如下:

publicinterfaceInitializingBean {
voidafterPropertiesSet() throwsException;
}


init-method需要通过配置文件或注解指定初始化方法

三、总结

最后总结下如何记忆 Spring Bean 的生命周期:

  • 首先是实例化、属性赋值、初始化、销毁这 4 个大阶段;
  • 再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;
  • 销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。
相关文章
|
1月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
6天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
6天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
55 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
1月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
26天前
|
监控 API 开发者
深入解析Docker容器的生命周期
【8月更文挑战第24天】
12 0
|
28天前
|
Java Spring
|
29天前
|
前端开发 Java 开发者
|
30天前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
2月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
96 0