Bean的生命周期

理解Spring Bean的生命周期很容易。当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当bean不再需要,并且从容器中移除时,可能需要做一些清除工作。

尽管还有一些bean实例化和销毁之间发生的活动,但是本章将只讨论两个重要的生命周期回调方法,他们在bean的初始化和销毁的时候是必要的。为了定义安装和拆卸一个bean,我们只要生命带有init-methoddestroy-method参数的。init-method属性指定一个方法,在实例化bean时,立即调用该方法。同样,destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法。

初始化回调

org.springframework.beans.factory.InitializingBean接口指定一个单一的方法:

void afterPropertiesSet() throws Exception;

因此,你可以简单地实现上述接口和初始化工作可以在afterPropertiesSet()方法中执行,如下图所示:

public class ExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}

在基于XML的配置元数据的情况下,你可以使用init-method属性来指定带有void无参数方法的名称。例如:

<bean id="exampleBean"
class="examples.ExampleBean" init-method="init"/>

下面是类的定义:

public class ExampleBean {
public void init() {
// do some initialization work
}
}

销毁回调

org.springframework.beans.factory.DisposableBean接口指定一个单一的方法:

void destroy() throws Exception;

因此,你可以简单地实现上述接口并且结束工作可以在destroy()方法中执行,如下图所示:

public class ExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work
}
}

在基于XML的配置元数据的情况下,你可以使用destroy-method属性来指定带有void无参数方法的名称。例如:

<bean id="exampleBean"
class="examples.ExampleBean" destroy-method="destroy"/>

下面是类的定义:

public class ExampleBean {
public void destroy() {
// do some destruction work
}
}

如果你在非web应用程序环境中使用Spring的IoC容器;例如在丰富的客户端桌面环境中;那么在JVM中你要注册关闭hook,这样做可以确保正常关闭,为了让所有资源都被释放,可以在单个beans上调用destroy方法。

建议你不要使用InitializingBean或者DisposableBean的回调方法,因为XML配置在命名方法上提供了极大的灵活性。

这里是HelloWorld.java的文件的内容:

package com.tutorialspoint;

public class HelloWorld {
private String message; public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} public void init() {
System.out.println("Bean is going through init.");
} public void destroy() {
System.out.println("Bean will destroy now.");
}
}

下面是MainApp.java文件的内容。 在这里,你需要注册一个在AbstractApplicationContext类中生命的关闭hook的registerShutdownHook()方法,它将确保正常关闭,并调用相关的destroy方法

public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
// XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));
// HelloWorld h = (HelloWorld) factory.getBean("helloWorld");
HelloWorld h = (HelloWorld) context.getBean("helloWorld1");
System.out.println(h.getMessage());
context.registerShutdownHook();
context.close();
}
}

下面是init和destroy方法需要配置的文件beans.xml

<?xml version="1.0" encoding="UTF-8"?>

<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-3.0.xsd">
<bean id="helloWorld" class="com.tutorialspoint.HelloWorld">
<property name="message" value="Hello World!"/>
</bean>
<bean id="helloWorld1" class="com.tutorialspoint.HelloWorld" scope="prototype" init-method="init" destroy-method="destroy">
<property name="message" value="hello fpc!"></property>
</bean>
</beans>

运行的结果:

发现并没有出现调用destroy方法,这是为什么?

Spring Bean声明周期的更多相关文章

  1. Spring Bean 生命周期之“我从哪里来?” 懂得这个很重要

    Spring bean 的生命周期很容易理解.实例化 bean 时,可能需要执行一些初始化以使其进入可用 (Ready for Use)状态.类似地,当不再需要 bean 并将其从容器中移除时,可能需 ...

  2. 大厂高频面试题Spring Bean生命周期最详解

    Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...

  3. Spring Bean生命周期,好像人的一生。。

    大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...

  4. Spring Bean生命周期回调方法

    参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory ...

  5. Spring Bean生命周期回调

    参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory ...

  6. spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理

    1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...

  7. Spring点滴四:Spring Bean生命周期

    Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...

  8. Spring Bean 生命周期之destroy——终极信仰

    上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...

  9. 常见问题:Web/Servlet生命周期与Spring Bean生命周期

    Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...

随机推荐

  1. C语言 · 删除数组中的0元素

    算法提高 6-9删除数组中的0元素   时间限制:1.0s   内存限制:512.0MB      编写函数CompactIntegers,删除数组中所有值为0的元素,其后元素向数组首端移动.注意,C ...

  2. Ubuntu 12.04 Subversion及GUI客户端RabbitVCS安装

    (经过一天的使用,发现pygtk的内存泄漏问题严重影响使用,需要打一下deepin ui做的补丁:https://github.com/linuxdeepin/deepin-ui) 1. 类似Tort ...

  3. 2018-11-21 ko.pureComputed的使用

    以前一直在想,ko.pureComputed 好像用不上.看起来高大上. 今天在修复一个bug时,发现了它的妙处. 在修改商品列表的页面,弹出一个新增商品的页面.关闭之后,怎么通知修改商品列表的页面发 ...

  4. memcached server LRU 深入分析

    Memcached,人所皆知的remote distribute cache(不知道的可以javaeye一下下,或者google一下下,或者baidu一下下,但是鉴于baidu的排名商业味道太浓(从最 ...

  5. CI框架中 类名不能以方法名相同

    昨天晚上一个坑爹的问题折腾了我一晚上,首先我来说下我的代码,我建立了一个index的控制器然后呢  在控制器里有一个index的方法.页面模板都有. if ( ! defined('BASEPATH' ...

  6. The Properties of Posterior of Topic Model

    1.Tang, Jian, et al. "Understanding the Limiting Factors of Topic Modeling via Posterior Contra ...

  7. 越大优先级越高,优先级越高被OS选中的可能性就越大

    进程的休眠:Thread sleep(1000);//括号中以毫秒为单位 当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序. Try{Thread.slee ...

  8. Web前端开发中的MCRV模式(转)

    作者: izujian  来源: baiduux 摘要:针对前端开发中基于ajax的复杂页面开发所面临的代码规模大,难以组织和维护,代码复用性.扩展性和适应性差等问题,本文尝试以MVC思想为 基础,结 ...

  9. 启动nmon报错while load libncurses.so.5 can not open shared(bit64)

    yum install ncurses-devel.i686 也有可能是软件包本身有问题,换一个try

  10. 使用typescript开发react应用

    初始化 mkdir project-dir cd project-dir yarn init -y 安装依赖 yarn add react react-dom yarn add -D typescri ...