手动关闭Spring容器

    Spring应用在web系统中,如果web服务停止,servlet容器会触发关闭事件并通知ContextLoaderListener,ContextLoaderListener中contextDestroyed方法调用closeWebApplicationContext(event.getServletContext())销毁Spring容器;但对于非web应用项目,则需要手动去关闭Spring;
    不过手动关闭Spring容器也很容易,Spring中ApplicationContext实现类大都继承AbstractApplicationContext,而AbstractApplicationContext中定义了一个 registerShutdownHook()的方法,不需要参数,只需要显示调用此方法即可,方法实现中会向jvm绑定一个系统钩子,在关闭时将执行此钩子;非web项目通常需要手工创建ApplicationContext,样例代码如下:
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.*;
import org.springframework.context.support.AbstractApplicationContext;

public class ServerApplication {

    //private static final ILog LOG = LogFactory.getLog(ServerApplication.class);


    public static void main(String[] args) {
        long b = System.currentTimeMillis();
    	//Spring启动时,会自动触发各Service启动
        ApplicationContext context =
                new AnnotationConfigApplicationContext(ServerApplication.class);

        long e = System.currentTimeMillis();
     //   LOG.info("ServerApplication started successfully in "+(e-b)+"ms.");
        if(context instanceof AbstractApplicationContext)
        {
            ((AbstractApplicationContext)context).registerShutdownHook();

        }
    }


}
 
 看下 registerShutdownHook实现,如下所示,会调用doClose()来关闭Spring容器。
	@Override
	public void registerShutdownHook() {
		if (this.shutdownHook == null) {
			// No shutdown hook registered yet.
			this.shutdownHook = new Thread() {
				@Override
				public void run() {
					doClose();
				}
			};
			Runtime.getRuntime().addShutdownHook(this.shutdownHook);
		}
	}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值