(轉)Spring 的 init-method 和 destory-method
背景:今天在項目中看到spring中bean在初始化和註銷時候的方法定義,之前沒有用過這種方式,在此記錄下,方便後期查看!
關於在spring 容器初始化 bean 和銷毀前所做的操作定義方式有三種:
第一種:[email protected] 和 @PreDestroy 方法 實現初始化和銷毀bean之前進行的操作
第二種是:通過 在xml中定義init-method 和 destory-method方法
第三種是: 通過bean實現InitializingBean和 DisposableBean接口
1 [email protected]
2 通過 在xml中定義init-method 和 destory-method方法
在xml中配置 init-method和 destory-method方法,只是定義spring 容器在初始化bean 和容器銷毀之前的所做的操作
基於xml的配置只是一種方式:
直接上xml中配置文件,定義SpringBeans.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" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jpa="http://www.springframework.org/schema/data/jpa"xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"> <bean id="personService" class="com.lxw.study.PersonService" scope="singleton" init-method="init" destroy-method="cleanUp" /> </beans>
ps:單例模式,表示spring容器中只存在一個bean,供程序調用
定義PersonService類:
package com.lxw.study; /** * @author lxw * @describe * @date 2017年7月25日 上午10:53:27 */ public class PersonService { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public void init(){ System.out.println("init"); } // how validate the destory method is a question public void cleanUp(){ System.out.println("cleanUp"); } }
相應的測試類:
package com.lxw.study; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author lxw * @describe * @date 2017年7月25日 上午10:53:59 */ public class MainTest { public static void main(String[] args) { AbstractApplicationContext context =new ClassPathXmlApplicationContext("SpringBeans.xml"); PersonService person = (PersonService)context.getBean("personService"); person.setMessage("hello spring01"); PersonService person_new = (PersonService)context.getBean("personService"); person_new.setMessage("hello spring02"); System.out.println(person.getMessage()); System.out.println(person_new.getMessage()); context.registerShutdownHook(); } }
測試結果:
init
hello spring02
hello spring02
cleanUp
ps:因為是單例模式,所以程序中修改的是同一個bean,正因為是單例模式,所以程序中的初始化和銷毀只執行一次。
可以看出 init 方法和 clean up方法都已經執行了。
context.registerShutdownHook(); 是一個鉤子方法,當jvm關閉退出的時候會調用這個鉤子方法,在設計模式之 模板模式中 通過在抽象類中定義這樣的鉤子方法由實現類進行實現,這裏的實現類是AbstractApplicationContext,這是spring 容器優雅關閉的方法。
3 通過bean實現InitializingBean和 DisposableBean接口
(轉)Spring 的 init-method 和 destory-method