开发者社区> 云栖号资讯小哥> 正文

一文详解Spring中Bean的生命周期

简介: 云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 在Spring中,Bean是最基础的对象,一切操作都是围绕Bean展开的。Spring是一个BOP(Bean Oriented Programming)框架,Bean在BOP中的作用就像是对象在OOP中的作用一样。
+关注继续查看

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


在Spring中,Bean是最基础的对象,一切操作都是围绕Bean展开的。Spring是一个BOP(Bean Oriented Programming)框架,Bean在BOP中的作用就像是对象在OOP中的作用一样。既然如此重要,那么我们首先需要了解到底什么是Bean?

什么是Bean

首先,我们来看看Spring官方文档对于Bean的定义:

1

从上面可知,我们可以给Bean下一个定义:Bean就是由IOC实例化、组装、管理的一个对象。

Bean的生命周期

我们需要明确的是,在这里我们的Bean的生命周期主要指的是singleton bean,对prototype bean来说,当用户getBean获得prototype bean的实例后,IOC容器就不再对当前实例进行管理,而是把管理权交由用户,此后再getBean生成的是新的实例。对于request/session/application/websocket 这几种scope的bean我们在此不谈。

在不同的容器中,Bean的生命周期开始的时间不同。对于ApplicationContext来说,当容器启动的时候,bean就已经实例化了。而对于BeanFactory来说,直到调用getBean()方法的时候才进行实例化。

我们知道对于普通的java对象来说,它们的生命周期就是

  • 实例化
  • 不再使用的时候通过垃圾回收机制进行回收

但是对于Bean来说却不是这样。Bean的生命周期如下图所示

11

对于如上这些方法,我们可以分成如下几类

1.Bean自身的方法:比如构造函数、getter/setter以及init-method和destory-method所指定的方法等

2.Bean级生命周期方法:可以理解为Bean类直接实现接口的方法,比如BeanNameAware、BeanFactoryAware、ApplicationContextAware、InitializingBean、DisposableBean等方法,这些方法只对当前Bean生效

3.容器级的方法(BeanPostProcessor一系列接口):主要是后处理器方法,比如上图的InstantiationAwareBeanPostProcessor、BeanPostProcessor接口方法。这些接口的实现类是独立于bean的,并且会注册到Spring容器中。在Spring容器创建任何Bean的时候,这些后处理器都会发生作用。

4.工厂后处理器方法(BeanFactoryProcessor一系列接口):包括AspectJWeavingEnabler、CustomAutowireConfigurer、ConfigurationClassPostProcessor等。这些都是Spring框架中已经实现好的BeanFactoryPostProcessor,用来实现某些特定的功能。

Bean自身的方法和Bean级生命周期方法都只对当前Bean起作用,但是容器级生命周期方法和工厂后处理器方法是对所有的bean都起作用。

对于这几类方法,1 2 4都很好理解,下面我们重点来说一下什么是BeanPostProcessor和BeanFactoryPostProcessor

以我个人理解来说,BeanPostProcessor和BeanFactoryPostProcessor就是Spring创建的扩展点,用户可以创建自己的实现类来修改Bean或者BeanFactory

注意对于ApplicatonContext来说,容器可以自动检测并加载BeanPostProcessor和BeanFactoryPostProcessor,但是BeanFactory不行,需要自己调用方法手动注册。BeanPostProcessor和BeanFactoryPostProcessor都可以有多个。ApplicationContext也可以根据org.springframework.core.PriorityOrdered和org.springframework.core.Ordered来进行自定义排序,但是BeanFactory不可以,默认顺序就是注册顺序。

这里我需要说明下面两个容易混淆的单词:

  • Instantiation:实例化,指的是调用构造函数进行实例化
  • Initialization:初始化,在Bean的声明周期中指的是init-method所指定的方法或者是InitializingBean.afterPropertiesSet()方法

下面我们对常用的这些接口进行说明:

常用接口说明

1.BeanNameAware

该接口只有一个方法setBeanName(String name),用来获取bean的id或者name

2.BeanFactoryAware

该接口只有一个方法setBeanFactory(BeanFactory beanFactory),用来获取当前环境中的BeanFactory

3.ApplicationContextAware

该接口只有一个方法setApplicationContext(ApplicationContext applicationContext),用来获取当前环境中的ApplicationContext

获取到IOC容器之后,可以对beans进行修改等操作

4.InitializingBean

该接口只有一个方法afterPropertiesSet(),在属性注入完成后调用

5.DisposableBean

该接口只有一个方法destroy(),在容器销毁的时候调用,在用户指定的destroy-method之前调用

6.BeanPostProcessor该接口有两个方法:

  • postProcessBeforeInitialization(Object bean, String beanName):在初始化之前调用此方法
  • postProcessAfterInitialization(Object bean, String beanName):在初始化之后调用此方法

通过方法签名我们可以知道,我们可以通过beanName来筛选出我们需要进行个性化定制的bean

7.InstantiationAwareBeanPostProcessor

该类是BeanPostProcessor的子接口,常用的有如下三个方法

  • postProcessBeforeInstantiation(Class beanClass, String beanName):在bean实例化之前调用
  • postProcessProperties(PropertyValues pvs, Object bean, String beanName):在bean实例化之后、设置属性前调用
  • postProcessAfterInstantiation(Class beanClass, String beanName):在Bean实例化之后调用

测试Bean生命周期

下面我们来编写一个实例来验证我们上面所说的Bean生命周期

首先,我们新建一个User,这个Bean实现了我们的BeanNameAware、ApplicationContextAware、InitializingBean、DisposableBean接口

11

然后我们实现我们自己的BeanPostProcessor

5

实现自己的InstantiationAwareBeanPostProcessor

6

xml配置文件如下

09

编写我们自己的测试类

7

最后运行项目

8

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-28
本文作者:写西瓜的Code
本文来自:“掘金”,了解相关信息可以关注“掘金”

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring 框架基础(02):Bean的生命周期,作用域,装配总结
本文源码:GitHub·点这里 || GitEE·点这里 一、装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象。
3375 0
严选 | Elasticsearch中文社区201903错题本
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,通过HTTP使用JSON进行数据索引,并基于RESTful web接口。用Java开发,设计用于云计算中,并且是当下最流行的企业级搜索引擎。
632 0
Spring(09)——bean生命周期回调方法
9 生命周期回调方法 对于Spring bean来讲,我们默认可以指定两个生命周期回调方法。一个是在ApplicationContext将bean初始化,包括注入对应的依赖后的回调方法;另一个是在ApplicationContext准备销毁之前的回调方法。
921 0
spring提供的关于bean生命周期的接口
先看一张图:spring4.x 企业实战 spring版本:4.3.171、bean自身的生命周期接口 1.1、实现 InitializingBean、DisposableBean 接口这2个接口,会要求你实现2个方法 ...
861 0
jQuery EasyUI API 中文文档 - 数字框(NumberBox)
NumberBox 数字框 扩展自 $.fn.validatebox.defaults,用 $.fn.numberbox.defaults 重写了 defaults 。 依赖 validatebox 用法 1. 1. $('#nn').numberbox({   2.     min:0,   3.     precision:2   4. });  特性 其特性扩展自 validatebox,下列是为 numberbox 增加的特性。
931 0
严选 | Elasticsearch中文社区201902错题本
马云演讲中曾经提到:很多时候少听成功专家的话。所有的创业者多花点时间学习别人是怎么失败的,因为成功的原因有千千万万,失败的原因就一两个点。
309 0
《Adobe Dreamweaver CS6中文版经典教程》——导读
Adobe Dreamweaver CS6是行业领先的Web内容制作程序。无论你是为了生活还是为了自己的事业而创建网站,Dreamweaver都提供了你所需的所有工具,帮助你达到专业水平。
1747 0
中文命名之Hibernate 5演示 - 使用注解(annotation)而非xml定义映射
用一个简单例子演示Hibernate 5 + MySQL基本功能中使用中文命名标识符.
755 0
+关注
云栖号资讯小哥
云栖号小编在此 ^o^
1403
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载