前言

今天和大家分享一下Spring中Bean的生命周期的一些知识。先来说一下什么是生命周期吧,生命周期从其语义上理解就是一个对象从产生到销毁的整个过程,之所以把这个过程称为生命周期是因为其就像一个生命一样包含了出生、死亡等等过程。

普通的java对象也有其生命周期,不过非常简单,可以归纳为:创建->使用->垃圾回收。Spring中的Bean本质上来说也是一个对象,但是因为bean是被容器管理的,所以其生命周期就复杂了很多。

理解Spring的生命周期是非常重要的,因为这除了能加深对Spring的理解之外还能帮助我们利用其生命周期中的扩展点来自定义Bean的创建过程。这在实际的开发中可能是非常实用的。

Spring中bean的生命周期

Spring中的bean在创建过程中大概分为以下几个步骤:

实例化->填充属性->执行Aware接口->初始化->可用状态->销毁

  1. 实例化就是调用类的构造器进行对象创建的过程,比如:new Object();就实例化了一个Obejct对象;
  2. 填充属性是指注入bean的依赖或者给属性赋值;
  3. Aware接口是Spring中的“觉醒”接口,是Spring容器通过回调向bean注入相关对象的接口;
  4. 初始化是指完成bean的创建和依赖注入后进行的一个回调,可以利用这个回调进行一些自定义的工作,实现初始化的方式有三种,分别是实现InitializingBean接口、使用@PostConstruct注解和xml中通过init-method属性指定初始化方法;
  5. 可用状态是指bean已经准备就绪、可以被应用程序使用了,此时bean会一直存在于Spring容器中;
  6. 销毁是指这个bean从Spring容器中消除,这个操作往往伴随着Spring容器的销毁。实现销毁方法的方式有3中,分别为实现DisposableBean接口、使用@PreDestroy注解和xml中通过destroy-method属性指定。

Spring中的Aware接口

Spring中的Aware接口是一个标记接口,其本身没有定义任何方法,具体的方法都在其实现类中定义。Aware在英文当中是“意识到”的意思,我更喜欢把它成为“觉醒”接口,这样更能有力地表达“这个bean知道了一些它不该知道的东西的意思。

Aware接口如下:

Aware接口

我们最常用的aware接口有以下几个:

意识到bean名称的接口,实现这个接口Spring容器会向bean注入BeanName:

org.springframework.beans.factory.BeanNameAware

意识到bean工厂的接口,实现这个接口Spring容器会向bean注入BeanFactory:

org.springframework.beans.factory.BeanFactoryAware

意识到ApplicationContext的接口,实现这个接口Spring容器会向bean注入ApplicationContext:

org.springframework.context.ApplicationContextAware

具体用法如下图:

Spring中的Aware接口

当然没我们也可以定义属性进行接收:

然后我们就可以把这些注入进来的属性当做普通的属性进行访问和操作了。其中aware接口的执行顺序是这样的:

BeanNameAware->BeanFactoryAware->ApplicationContextAware

Bean生命周期中的扩展点

在这些过程当中有很多的扩展点,这里我们介绍一些常用的,我们用EP(extension point)来进行标识,如下:

EP1->实例化->EP2->填充属性->执行Aware接口->EP3->初始化->EP4->可用状态->销毁

从上述过程中我们可以看出实例化前后的扩展点分别为EP1和EP2,初始化前后的扩展点分别为EP3和EP4。

实现这几个扩展点通常的做法是继承这样一个适配器:

InstantiationAwareBeanPostProcessorAdapter

这个适配器是后置处理器接口BeanPostProcessor的子类,有很多方法,这里只需实现以下几个就可以了:

扩展点方法

扩展点和对应的方法如下:

  1. 实例化前的扩展点EP1 => postProcessBeforeInstantiation
  2. 实例化后的扩展点EP2 => postProcessAfterInstantiation
  3. 初始化前的扩展点EP3 => postProcessBeforeInitialization
  4. 初始化后的扩展点EP4 => postProcessAfterInitialization

对于这几个方法需要注意一下几点:

  1. 这四个方法是后置处理器中的方法,会对所有的bean进行处理,如果需要对特定的bean进行处理的话,需要通过方法中的参数beanName进行针对性的处理;
  2. 后置处理器BeanPostProcessor可以指定多个,当初始化一个bean时所有的后置处理器都会进行处理。
  3. 初始化前后的两个扩展点方法postProcessBeforeInitialization和postProcessAfterInitialization方法不能返回null,返回null的话后面的BeanPostProcessor就不会执行了,而且这个bean也会从Spring容器中剔除。
  4. 实例化之后的扩展点EP2方法postProcessAfterInstantiation一般都是需要返回true的,如果返回false的话就不会对该bean进行属性注入了,这通常并不是我们想要的。

spring bean生命周期_Spring中bean的生命周期和扩展点有哪些?相关推荐

  1. android viewpager fragment 生命周期,ViewPager中Fragment的生命周期

    网上有很多Fragment生命周期的帖子,但是看了一下,没有找到自己想了解的东西,于是决定自己动手体验一下这个生命周期.主要想了解以下几个问题: Activity中的Fragment的生命周期 Vie ...

  2. java中bean的作用域有哪些_Spring中Bean的5种作用域scope详解

    Spring Bean简介: 在spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean. 简单地讲,bean就是由Spring容器初始化 ...

  3. java中bean的作用域有哪些_Spring中Bean的作用域

    本节先简单介绍了 Spring 中 bean 的 5 种作用域,然后详细介绍 singleton 和 prototype 这两种最常用的作用域. 作用域的种类 Spring 容器在初始化一个 Bean ...

  4. java中的的一些生命周期,Java中对象的生命周期

    Java中对象的生命周期 (1) 对象生命周期的开始 对象生命周期开始时,需要为对象分配内存,并且初始化它的实例变量: 对象生命周期结束 Java虚拟机的垃圾回收线程回收对象的内存. (2) 创建一个 ...

  5. java中线程的生命周期_Java中的线程生命周期– Java中的线程状态

    java中线程的生命周期 Understanding Thread Life Cycle in Java and Thread States are very important when you a ...

  6. java中bean是什么_java中bean是什么意思?有什么作用 | 学步园

    Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重 ...

  7. spring拦截器覆盖_Spring中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  8. 【面试题】Spring框架中Bean的生命周期

    生命周期 1.实例化一个Bean--也就是我们常说的new一个对象: 2.按照Spring上下文对实例化的Bean进行配置--也就是IOC注入: 3.如果这个Bean已经实现了BeanNameAwar ...

  9. Spring中Bean的生命周期是怎样的

    于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: ...

最新文章

  1. 百度UEditor编辑器关闭抓取远程图片功能(默认开启)
  2. html中多边形图形怎么制作,CSS制作图形速查表
  3. LeetCode53:最大子序和(分治思想,Python3实现)
  4. C#DateTime.ToString格式化时间字符串
  5. C++(STL):20---deque容器访问元素
  6. Multi_thread--Linux下多线程编程互斥锁和条件变量的简单使用
  7. 为什么要简化代码书写
  8. 混合使用UITabBarController和UINavigationController
  9. 远程mysql_java.sql.SQLException: null, message from server: Host 'xxx' is not allowed to connect
  10. Thrift 对象序列化、反序列化-字节数组分析
  11. android json 转map,json字符串转map
  12. matlab画基尼系数,matlab 拟合洛伦兹曲线求基尼系数
  13. 2021-04-13
  14. Windows 系统维护
  15. 优维科技EasyOps®一体化运维平台入选“大信创产品目录”
  16. Microsoft SQL Server 2000 Service Pack 3a
  17. TOOD: Task-aligned One-stage Object Detection 原理与代码解析
  18. 在线ssd测试软件,AS SSD Benchmark测试
  19. Android Studio Win7安装
  20. 中移动TD-LTE及对终端的要求

热门文章

  1. IOS应用程序发布到苹果APP STORE完整流程使用教程
  2. 音频特效:Flanger 和 Chorus
  3. iis8使用url2.0模块实现http跳转到https
  4. 一个简单例子:贫血模型or领域模型
  5. php实战第二十五天
  6. Apache Load Balance Using Haproxy
  7. linux中的设备名称和设备号,linux中的设备名称和设备号
  8. 简述台式计算机创建家庭组的步骤,如何创建和设置家庭组
  9. RocketMQ(六)—IndexFile详解
  10. 12linux目录结构13Linux目录详解