Spring的Bean生命周期

       Spring容器可以管理singleton作用域的Bean的生命周期,在此作用域下,Spring能够精确地知道该Bean何时被创建,何时初始化完成以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean实例之后,Bean的实例就交给客户端代码来管理,Spring容器不再跟踪其生命周期。
       了解Bean的生命周期的意义就在于,可以在某个Bean生命周期的某些指定时刻完成一些相关操作,但一般情况下常会在Bean的初始化和销毁的时候执行一些相关操作。
       理解 Spring bean 的生命周期很容易。当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。此外还有一些在Bean实例化和销毁之间的活动。

Spring容器中,Bean的生命周期流程图如下图所示:
在这里插入图片描述
       为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的 。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。

接下来重点介绍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
	}
}

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

接下来写一个Demo来更深刻的理解Bean的生命周期

  1. 创建一个名称为 SpringExample 的项目,并且在创建项目的 src 文件夹中创建一个包 com.tutorialspoint
  2. 使用 Add External JARs 选项,添加所需的 Spring 库
  3. 在 com.tutorialspoint 包中创建 Java 类 HelloWorld 和 MainApp
  4. 在 src 文件夹中创建 Beans 配置文件 Beans.xml
  5. 最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序

HelloWorld.java文件内容如下:

package com.tutorialspoint;

public class HelloWorld {
	private String message;

	public void setMessage(String message) {
		this.message = message;
	}

	public void getMessage() {
		System.out.println("Your 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 方法

package com.tutorialspoint;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
	public static void main(String[] args) {
		AbstractApplicationContext context = 
				new ClassPathXmlApplicationContext("Beans.xml");
		HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
		obj.getMessage();
		/** 它将确保正常关闭,并且调用相关的 destroy 方法 */
		context.registerShutdownHook();
	}
}

下面是 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-4.3.xsd">

	<bean id="helloWorld" class="com.tutorialspoint.HelloWorld"
		init-method="init" destroy-method="destroy">
		<property name="message" value="Hello World!" />
	</bean>

</beans>

运行MainApp.java文件,结果如下:
在这里插入图片描述
默认的初始化和销毁方法
       如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明 初始化方法和销毁方法。框架使用 元素中的 default-init-methoddefault-destroy-method 属性提供了灵活地配置这种情况,如下所示:

<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"
default-init-method="init"
default-destroy-method="destroy">
	<bean id="..." class="...">
		<!-- collaborators and configuration for this bean go here -->
	</bean>
</beans>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lw中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值