spring容器中Bean生命周期

本文涉及的产品
容器镜像服务 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 进行销毁。
相关文章
|
4天前
|
安全 Java Spring
Spring框架中的单例Bean是线程安全的吗?
Spring框架中的单例Bean是线程安全的吗?
10 1
|
4天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
4天前
|
XML 前端开发 Java
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
【JavaEE】深入了解Spring中Bean的可见范围(作用域)以及前世今生(生命周期)
7 0
|
4天前
|
存储 缓存 Java
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring中注解的方式去获取Bean对象
3 0
|
4天前
|
存储 Java 对象存储
【JavaEE】Spring中注解的方式去存储Bean对象
【JavaEE】Spring中注解的方式去存储Bean对象
7 0
|
4天前
|
存储 Java 对象存储
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
【JavaEE】DI与DL的介绍-Spring项目的创建-Bean对象的存储与获取
9 0
|
4天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
20 0
|
4天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
21 1
|
4天前
|
XML Java 数据格式
Spring Bean
【4月更文挑战第30天】Spring Bean
17 0
|
4天前
|
XML Java 数据格式
Spring IoC容器初始化过程(xml形式)
Spring IoC容器初始化过程(xml形式)
54 0