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. Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程

    1.入门 Laravel通过Artisan提供了强大的控制台命令来处理非浏览器业务逻辑.要查看Laravel中所有的Artisan命令,可以通过在项目根目录运行: php artisan list 对 ...

  2. Math - Uva 11300 Spreading the Wealth

    Spreading the Wealth Problem's Link ---------------------------------------------------------------- ...

  3. js学习笔记22----BOM属性和方法

    BOM基本概念 : Browser Object Model 浏览器对象模型. BOM属性: window.navigator.userAgent : 浏览器信息 判断是否是某个浏览器,可以用 ind ...

  4. 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头(特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1607 其实题目描述不清楚,应该是 别人拿的数能整除自己拿的数 数据范围很大,n<=100000 ...

  5. freemarker2 指令

    if,else,elseif 指令  <#if x==1> x is 1 </#if> <#if==1> x is 1 <#else> x is not ...

  6. css图标

    一.介绍 采用这种字体,我们可以避免网站制作中采用好多图片,一方面解决了浏览器的兼容性问题.另一方面,这些字体都是矢量字体,我们只要在调整这些图标时,将他们的字体大小以及颜色,我们就可以解决很多不是图 ...

  7. 一次清除SQL SERVER错误日志的体会!

    之前在UAT环境搭建的SQL SERVER 2008 R2数据库一直用得比较正常,但最近发现在Sharepoint中不能进行任何操作了,开始以为是什么配置出了问题(因为一直在研究一些新的应用和集成,需 ...

  8. logback中MDC使用

    今天在项目发现别人写了很多MDC.put("taskid", "testThread/heart/main_heart");或者MDC.put("ta ...

  9. Jquery之编辑不可修改

    <td class="queryTitle" width="100">优惠券批次号</td> <td class="qu ...

  10. C语言字符串的输入输出

    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串. printf():通过格式控制符 %s 输出字符串.除了字符串,printf() 还能输出其他类 ...