接下来,在上面这个环境中来为
BookDao
添加生命周期的控制方法,具体的控制有两个阶段
:
1.bean
创建之后,想要添加内容,比如
用来初始化需要用到资源
2.bean
销毁之前,想要添加内容,比如
用来释放用到的资源
若只是写了这两个方法没有进行配置的话,这两方法是不会运行的
从结果中可以看出,init方法执行了,但是destroy方法却未执行,这是为什么呢?
Spring
的
IOC
容器是运行在
JVM
中
运行
main
方法后
,JVM
启动
,Spring
加载配置文件生成
IOC
容器
,
从容器获取
bean
对象,然后调方
法执行
main
方法执行完后,
JVM
退出,这个时候
IOC
容器中的
bean
还没有来得及销毁就已经结束了
所以没有调用对应的
destroy
方法
知道了出现问题的原因,具体该如何解决呢?
close关闭容器
上面这个方法太简单粗暴了,还有一种方法可以关闭容器的方法,等bean销毁后,虚拟机再退出
注册钩子关闭容器
两种方式介绍完后,
close
和
registerShutdownHook
选哪个
?
相同点
:
这两种都能用来关闭容器
不同点
:
close()
是在调用的时候关闭,
registerShutdownHook()
是在
JVM
退出前调用关闭。
分析上面的实现过程,会发现添加初始化和销毁方法,即需要编码也需要配置,实现起来步骤比较多 ,也比较乱。
Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-method和
destroy-method
接下来在
BookServiceImpl
完成这两个接口的使用
:
修改
BookServiceImpl
类,添加两个接口
InitializingBean
,
DisposableBean
并实现接口中的
两个方法
afterPropertiesSet
和
destroy