Spring Bean 的生命周期回调

Spring中的Bean是随着Spring容器产生的,当Spring容器关闭的时候,相应的Bean也会消失。当然这个和Bean自身的作用域范围也有关系,但是通常都逃不过 初始化,运行,关闭这三个状态。

在Spring中,我们通常需要在Bean刚刚初始化的时候,或者Bean被销毁的时候做一些额外的资源处理的事情。Spring提供了InitializingBean和DisposableBean接口,前者调用afterPropertiesSet(),为后者调用destroy(),以便bean在初始化和销毁bean时执行某些操作。

如下所示:

public class SampleInitializingBean implements InitializingBean {

    @Override
public void afterPropertiesSet() throws Exception {
log.info("inside afterPropertiesSet");
}
}
public class SampleDisposableBean implements DisposableBean {

    @Override
public void destroy() throws Exception {
log.info("destroy");
}
}

当然这样做就和Spring的代码耦合了。我们可以使用JSR-250 的@PostConstruct和@PreDestroy注解,这样就和Spring框架解耦了。

第三种方法就是使用配置的init-method和destroy-method,或者使用@Bean的initMethod属性和@Bean的destroyMethod属性。

如下所示:

    <bean id="exampleInitBean" class="com.flydean.beans.ExampleBean"
init-method="init" destroy-method="destroy"/>

下面是@Bean注解的例子:

    @Bean(initMethod = "init",destroyMethod = "destroy")
public ExampleBean getExampleBean(){
return new ExampleBean();
}

也可以为所有的bean都添加一个默认的初始化方法,和销毁方法:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-init-method="init" default-destroy-method="destroy">

总结生命周期机制

从Spring2.5之后,你有3种方式来控制bean的生命周期:

  • InitializingBean和DisposableBean回调接口
  • 自定义init() 和destroy() 方法。
  • @PostConstruct 和 @PreDestroy注解.

如果为initialization配置了多种生命周期的多个名字,那么执行顺序如下:

  • @PostConstruct 的方法注解
  • InitializingBean接口里面的afterPropertiesSet() 方法
  • 自定义的init() 方法

同样的Destroy也是一样的顺序:

  • @PreDestroy 的方法注解
  • DisposableBean接口里面的destroy() 方法
  • 自定义的destroy() 方法

startup和Shutdown回调

上面我们讲了在bean初始化和销毁的时候的回调。一般来说就已经够用了。如果需要自己管理生命周期对象,比如启动和停止一些后台进程的时候,Spring提供了Lifecycle接口。

public interface Lifecycle {

    void start();

    void stop();

    boolean isRunning();
}

任何Spring管理的对象都可以实现Lifecycle接口。当ApplicationContext收到一个start或者stop信号时,他会将该信号传递给所有的Lifecycle接口的实现。

Spring提供了LifecycleProcessor接口,该接口的默认实现是DefaultLifecycleProcessor :

public interface LifecycleProcessor extends Lifecycle {

	/**
* Notification of context refresh, e.g. for auto-starting components.
*/
void onRefresh(); /**
* Notification of context close phase, e.g. for auto-stopping components.
*/
void onClose(); }

onRefresh()和onClose()会去调用实现了Lifecycle接口的start()和close()方法。

如果需要实现启动和关闭回调的顺序,则可以实现SmartLifecycle接口,该接口提供了getPhase()方法:

 public interface SmartLifecycle extends Lifecycle, Phased {

    boolean isAutoStartup();

    void stop(Runnable callback);
}

启动时,具有最低phase的对象首先启动。停止时,按相反顺序执行。

优雅的关闭Spring IoC容器

如果是Spring WEB应用程序,Spring的web基础的ApplicationContext实现,已经有代码优雅的关闭 Spring IoC 容器。

这里我们考虑非web情况,我们需要注册一个shutdown hook到JVM中。这样将保证优雅的关闭,并且在单例bean中调用相关的销毁方法,让所有的资源得到释放。

调用ConfigurableApplicationContext接口中的registerShutdownHook()来注册一个shutdown hook, 如下所示:

    public static void main(final String[] args) throws Exception {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("bean-lifecycle.xml"); // add a shutdown hook for the above context...
ctx.registerShutdownHook(); // app runs here... // main method exits, hook is called prior to the app shutting down...
}

本节的代码可以参考bean-lifecycle

更多教程请参考flydean的博客

Spring5参考指南:Bean的生命周期管理的更多相关文章

  1. Spring5参考指南:Bean作用域

    文章目录 Bean作用域简介 Singleton作用域 Prototype作用域 Singleton Beans 中依赖 Prototype-bean web 作用域 Request scope Se ...

  2. Spring5参考指南:Bean的创建

    文章目录 Spring容器中的Bean Bean的命名 Bean的实例化 Spring容器中的Bean Bean在Spring中就是一个业务组件,我们通过创建各种Bean来完成最终的业务逻辑功能. 在 ...

  3. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  4. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  5. Bean的生命周期

    Bean的生命周期 原文:http://997004049-qq-com.iteye.com/blog/1729793 任何一个事物都有自己的生命周期,生命的开始.生命中.生命结束.大家最熟悉的应该是 ...

  6. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring Bean的生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. 而对于 protot ...

  7. 【Spring】Spring中的Bean - 4、Bean的生命周期

    Bean的生命周期 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 了解Spring中Bean的生命周期有何意义? 了解Sp ...

  8. Spring4.0学习笔记(5) —— 管理bean的生命周期

    Spring IOC 容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 Spring IOC 容器对Bean的生命周期进行管理的过程: 1.通过构造器或工厂方法 ...

  9. Spring Bean 的生命周期,如何被管理的?

    定义 Bean是一个被实例化,组装,并通过Spring IOC容器(BeanFactory和ApplicationContext容器)所管理的对象. 作用域 Spring支持五个作用域,分别是sing ...

随机推荐

  1. 《Java基础复习》—常识与入门

    突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...

  2. 001_Chrome 76支持原生HTML 图片懒加载Lazy loading

    Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...

  3. Ubuntu16.04默认Python3.5升级Python3.6踩坑

    好久没更新博客了,每天还是踩坑中.今天遇到第一个问题“ImportError: No module named 'secrets'”,导包是常见问题.这次的问题导致我又重装了一次环境,不过这是一个新服 ...

  4. es elasticsearch 6/7 设置内存方法

    es节点的默认的heap内存大小是 1G 大小,在实际生产中,很容易导致内存溢出而导致进程被kill掉.所以我们一般会自己配置自己的,2.x的版本可以通过export ES_HEAP_SIZE=10g ...

  5. fastfdfs搭配nginx

    fastfdfs搭配nginx 下载fastdfs-nginx-module 模块 wget https://github.com/happyfish100/fastdfs-nginx-module/ ...

  6. Python常见数据结构-List列表

    Python list基本特点 列表是一种有序集合,可以随时添加和删除元素. 序列中的每个元素都分配一个数字 - 它的位置. 列表的数据项不需要具有相同的类型. 创建一个列表,只要把逗号分隔的不同的数 ...

  7. 30.5 Map遍历方法

    package day30_2_Map; import java.util.HashMap; import java.util.Map; import java.util.Set; /* 方法一.用e ...

  8. jetCache 基本使用

    1.pom引用 <!--jetcache缓存 lettuce--> <dependency> <groupId>com.alicp.jetcache</gro ...

  9. Linux Mint(Ubuntu)如何管理开机自动启动项?

    Linux Mint自带了一个简洁的开机自启管理应用,使用方法也很简单: 依次点击“Menu”==>“控制中心”==>“个人”==>“启动应用程序”,界面如图所示: 上面打勾的就是系 ...

  10. Centos7 编译安装 Libmcrypt 库

    0x00 先下载 libmcrypt 库源码 libmcrypt-2.5.8.tar.gz 或者去这里 libmcrypt 下载你需要的版本. 0x01 将下载的源码解压到文件夹 tar -zxvf ...