Spring Bean声明周期
Bean的生命周期
理解Spring Bean的生命周期很容易。当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当bean不再需要,并且从容器中移除时,可能需要做一些清除工作。
尽管还有一些bean实例化和销毁之间发生的活动,但是本章将只讨论两个重要的生命周期回调方法,他们在bean的初始化和销毁的时候是必要的。为了定义安装和拆卸一个bean,我们只要生命带有init-method和destroy-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声明周期的更多相关文章
- Spring Bean 生命周期之“我从哪里来?” 懂得这个很重要
Spring bean 的生命周期很容易理解.实例化 bean 时,可能需要执行一些初始化以使其进入可用 (Ready for Use)状态.类似地,当不再需要 bean 并将其从容器中移除时,可能需 ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
- Spring Bean生命周期回调方法
参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory ...
- Spring Bean生命周期回调
参阅官方文档:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html#beans-factory ...
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
- Spring点滴四:Spring Bean生命周期
Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...
- Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...
- 常见问题:Web/Servlet生命周期与Spring Bean生命周期
Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...
随机推荐
- EasyUI Tree添加节点
创建foods tree首先,我们创建foods tree,代码像这样: <div style="width:200px;height:auto;border:1px solid #c ...
- Struts框架可以支持以下哪种程序开发语言?(选择1项)
A.C B.C++ C.Java D.C# 解答:C
- poj 1127:Jack Straws(判断两线段相交 + 并查集)
Jack Straws Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2911 Accepted: 1322 Descr ...
- 一稿设计多端适配优雅的解决方案 - rem
规范目的 为提高前端团队开发效率,输出高质量的前端页面代码,提高UI设计还原度,特编写该规范文档.本文档如有不对或者不合适的地方请及时提出. JS代码块 (function (doc, win) { ...
- CodeForces 558C Amr and Chemistry (位运算,数论,规律,枚举)
Codeforces 558C 题意:给n个数字,对每一个数字能够进行两种操作:num*2与num/2(向下取整),求:让n个数相等最少须要操作多少次. 分析: 计算每一个数的二进制公共前缀. 枚举法 ...
- IDEA破解后无法启动
在网上找了破解IDEA的方法 原文:https://blog.csdn.net/qq_38637558/article/details/78914772 ①到这个地方下载 IntelliJ IDEA ...
- 最受欢迎的五大BUG管理系统
五大最受欢迎的BUG管理系统 Google在中国大*陆遭遇变故做出暂时性的退出大*陆市场,也使很多忠实的用户受到小小的挫折,以本公司为例,原本的BUG都是记录在google的EXCEL在线文档中 ...
- 【BZOJ1135】[POI2009]Lyz 线段树
[BZOJ1135][POI2009]Lyz Description 初始时滑冰俱乐部有1到n号的溜冰鞋各k双.已知x号脚的人可以穿x到x+d的溜冰鞋. 有m次操作,每次包含两个数ri,xi代表来了x ...
- vector排序问题<unresolved overloaded function type>
要对vector中的自定义类型进行排序,首先需要提供一个函数bool comp(const Interval & a, const Interval & b) 来定义类型的排序准则 然 ...
- [Domino]执行命令load design的时候出现Warning: Cannot locate design template
发现问题 在做Pseudo Test的时候被QA测出了一个问题.在Domino concole打命令“load design”,被Workbench翻译过后的数据库提示了一个警告:Warning: C ...