当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。当bean不再需要,并且从容器中移除时,需要做一些清除工作。为了定义安装和拆卸一个 bean,我们只要声明init-method 和/或 destroy-method 参数。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method 指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。
编写HelloWorld.java
1 package com.example.spring; 2 3 public class HelloWorld { 4 private String message; 5 public void setMessage(String message){ 6 this.message = message; 7 } 8 9 public void getMessage(){ 10 System.out.println("Your Message : " + message); 11 } 12 //定义初始化方法 13 public void init(){ 14 System.out.println("Bean is going through init."); 15 } 16 //定义销毁方法 17 public void destroy(){ 18 System.out.println("Bean will destroy now."); 19 } 20 }
编写Beans.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <bean id="helloWorld" 7 class="com.example.spring.HelloWorld" 8 init-method="init" destroy-method="destroy"> 9 <property name="message" value="Hello World"></property> 10 </bean> 11 </beans>
编写Application.java
1 package com.example.spring; 2 3 import org.springframework.context.support.AbstractApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class Application { 7 public static void main(String[] args) { 8 //bean配置文件所在位置 D:\\IdeaProjects\\spring\\src\\Beans.xml 9 //使用AbstractApplicationContext容器 10 AbstractApplicationContext context = new ClassPathXmlApplicationContext("file:D:\\IdeaProjects\\spring\\src\\Beans.xml"); 11 HelloWorld obj = (HelloWorld)context.getBean("helloWorld"); 12 obj.getMessage(); 13 //registerShutdownHook关闭hook,确保正常关闭,并调用destroy方法 14 context.registerShutdownHook(); 15 } 16 }
运行输出
Bean is going through init. Your Message : Hello World! Bean will destroy now.
默认的初始化和销毁方法
如果你有太多具有相同名称的初始化或者销毁方法的 Bean,那么你不需要在每一个 bean 上声明初始化方法和销毁方法。框架使用 元素中的 default-init-method 和 default-destroy-method 属性提供了灵活地配置这种情况,如下所示:
<?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.xsd" default-init-method="init" default-destroy-method="destroy"> <bean id="helloWorld" class="com.example.spring.HelloWorld"> <property name="message" value="Hello World"></property> </bean> </beans>
运行输出
Bean is going through init.
Your Message : Hello World!
Bean will destroy now.