但,如果你正在一個非web應用的環境下使用spring的IoC容器,如dubbo服務,你想讓容器優雅的關閉,並調用singleton的bean相應destory回調方法,你需要在JVM裏註冊一個“關閉鉤子”(shutdown hook)。這一點非常容易做到,並且將會確保你的Spring IoC容器被恰當關閉,以及所有由單例持有的資源都會被釋放。
爲了註冊“關閉鉤子”,你只需要簡單地調用在org.springframework.context.support.AbstractApplicationContext實現中的registerShutdownHook()方法即可。
- package com.hcm.dubbo.service;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class DubboServiceStart {
- private static final Logger LOG = LoggerFactory.getLogger(DubboServiceStart.class);
- public static final String DUBBO_PROVIDER = "spring/dubbo-provider.xml";
- public static void init() {
- LOG.info("開始啓動dubo服務,載入的配置服務提供文件爲[" + DUBBO_PROVIDER + "]");
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { DUBBO_PROVIDER });
- context.registerShutdownHook();
- context.start();
- LOG.info("dubbo啓動服務完畢,請查看日誌");
- String[] names = context.getBeanDefinitionNames();
- System.out.print("Beans:");
- for (String string : names) {
- System.out.print(string + ",");
- }
- System.out.println();
- }
- public static void main(String[] args) throws InterruptedException {
- DubboServiceStart.init();
- while (true) {
- try {
- Thread.currentThread();
- Thread.sleep(3L);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
eg:普通的案例:
- public class WebStart {
- private static String path="classpath:spring-configuration/*.xml";
- //通過AbstractApplicationContext,註銷類實例
- private static AbstractApplicationContext context=null;
- public static void startUp(){
- context=new ClassPathXmlApplicationContext(path);
- String[] beans=context.getBeanDefinitionNames();
- System.out.println("count:"+context.getBeanDefinitionCount());
- for(String str:beans){
- System.out.println(str);
- }
- }
- public static void main(String[] args) {
- startUp();
- context.registerShutdownHook();//註冊關閉鉤子
- context.close();
- }
- }
agentFilmService
agentService