Spring中Bean的生命周期

简介: 先直接说出过程,再来演示具体的操作

过程


eefabac9b74d4a568d1d12b99edf2fef.png

简化来说就是


1、首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化,实际上就是通过反射的方式创建出一个bean对象


2、Bean实例创建出来后,接着就是给这个Bean对象进行属性填充,也就是注入这个Bean依赖的其它bean对象


3、属性填充完成后,进行初始化Bean操作,初始化阶段又可以分为几个步骤:


执行Aware接口的方法

Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的些资源。如实现

BeanNameAware接口可以获取到BeanName,实现BeanFactoryAware接口可以获取到工厂对象BeanFactory等

执行BeanPostProcessor的前置处理方法postProcessBeforelnitialization(),对Bean进行一些自定义的前置处理

判断Bean是否实现了InitializingBean接口,如果实现了,将会执行lnitializingBean的afeterPropertiesSet()初始化方法;

执行用户自定义的初始化方法,如init-method等;

执行BeanPostProcessor的后置处理方法postProcessAfterinitialization()

4、初始化完成后,Bean就成功创建了,之后就可以使用这个Bean, 当Bean不再需要时,会进行销毁操作,


首先判断Bean是否实现了DestructionAwareBeanPostProcessor接口,如果实现了,则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法

其次会判断Bean是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法

最后判断这个Bean是否配置了dlestroy-method等自定义的销毁方法,如果有的话,则会自动调用其配置的销毁方法;


调用构造方法


7f13e6c23c304091adba8ce12b1f0221.png


设置属性


7c939ac76d3b4e2196a4fbe5b218c668.png


看是否实现了xxxAware接口


43e923c7c11341df9b1e76e32fcbeedb.pnged99df09f7bf430a8c6723fea2d49910.png


看是否设置了BeanPostProcessor接口中的postProcessBeforeInitialization方法


fd30615bfd8242528710f303a065adac.png



看是否设置了初始化方法


91dc723d716e4ff9af988e9779c2dd5e.png


看是否设置了BeanPostProcessor接口中的postProcessAfterInitialization方法


b7f2f5b11a02465497a5bc235460ba02.png


使用


485cd05a4fa34ab48633e5b4098ecdda.png


看是否设置了销毁前的方法


5fe09849d565477cbac69c433f14b53b.png


运行结果


baed07b4db1e43038e6500ebf7bb10ee.png6e8f9778c37448e985c3c9869b28726f.png


初始化和销毁前的方法都有三种方式


声明式注解 @PostConstruct(初始化)@PreDestroy(销毁)

接口式 InitializingBean(初始化接口)、DisposableBean(销毁接口)

自定义式 xml/@Bean方式

顺序都是声明式->接口式->自定义式

a109766b3e9844fda0ad61ccde1551da.png75c6399eb36f4fd3933e52f4201bf735.png6b2fa7656d81449e98d89e271d1fe075.png0fb4c885e3b1477fba18bb5b6373ff96.png

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