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. EasyUI Tree添加节点

    创建foods tree首先,我们创建foods tree,代码像这样: <div style="width:200px;height:auto;border:1px solid #c ...

  2. Struts框架可以支持以下哪种程序开发语言?(选择1项)

    A.C B.C++ C.Java D.C# 解答:C

  3. poj 1127:Jack Straws(判断两线段相交 + 并查集)

    Jack Straws Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2911   Accepted: 1322 Descr ...

  4. 一稿设计多端适配优雅的解决方案 - rem

    规范目的 为提高前端团队开发效率,输出高质量的前端页面代码,提高UI设计还原度,特编写该规范文档.本文档如有不对或者不合适的地方请及时提出. JS代码块 (function (doc, win) { ...

  5. CodeForces 558C Amr and Chemistry (位运算,数论,规律,枚举)

    Codeforces 558C 题意:给n个数字,对每一个数字能够进行两种操作:num*2与num/2(向下取整),求:让n个数相等最少须要操作多少次. 分析: 计算每一个数的二进制公共前缀. 枚举法 ...

  6. IDEA破解后无法启动

    在网上找了破解IDEA的方法 原文:https://blog.csdn.net/qq_38637558/article/details/78914772 ①到这个地方下载 IntelliJ IDEA ...

  7. 最受欢迎的五大BUG管理系统

    五大最受欢迎的BUG管理系统    Google在中国大*陆遭遇变故做出暂时性的退出大*陆市场,也使很多忠实的用户受到小小的挫折,以本公司为例,原本的BUG都是记录在google的EXCEL在线文档中 ...

  8. 【BZOJ1135】[POI2009]Lyz 线段树

    [BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...

  9. vector排序问题<unresolved overloaded function type>

    要对vector中的自定义类型进行排序,首先需要提供一个函数bool comp(const Interval & a, const Interval & b) 来定义类型的排序准则 然 ...

  10. [Domino]执行命令load design的时候出现Warning: Cannot locate design template

    发现问题 在做Pseudo Test的时候被QA测出了一个问题.在Domino concole打命令“load design”,被Workbench翻译过后的数据库提示了一个警告:Warning: C ...