@Component
public class GouZi implements InitializingBean {
private static final Logger LOGGER = LoggerFactory.getLogger(GouZi.class);
private final ExecutorService executorService = Executors.newFixedThreadPool(8);
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("东科教育");
//钩子方法
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run() {
//写上你需要钩子处理的业务逻辑,下面为一个例子,防止服务宕机时,线程没有关闭
executorService.shutdown();
System.out.println("www.dongkit.com");
}
});
System.out.println("高薪就业");
}
}
当初始化bean的时候走到咱们的afterPropertiesSet方法当中,那么咱们的钩子什么时候执行?
输出结果为:
东科教育
高新就业
由此看出钩子方法是在主程序走完后调用。
简单介绍下InitializingBean :接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法.该方法将在所有的属性被初始化后调用,但是会在init前调用。
钩子:Java程序经常也会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。
JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用:
1.程序正常退出
2.使用System.exit()
3.终端使用Ctrl+C触发的中断
4.系统关闭
5.OutOfMemory宕机
6.使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的)