指的是一个对象创建、存活、消亡的一个完整过程,由 Spring 来负责
创建阶段
ApplicationContext
)创建时,对象创建ctx.getBean("")
),对象创建<aside>
💡 设置 scope = singleton 这种情况下,也需要在获取对象的同时,创建对象:<bean lazy-init="true"/>
</aside>
初始化阶段(创建完对象后,调用对象的初始化方法,完成对应的初始化操作)
实现 InitializingBean 接口,重写方法完成初始化操作
//程序员根据需求,实现的⽅法,完成初始化操作
public void afterProperitesSet(){
}
对象中提供一个普通的方法
public void myInit(){
}
<bean id="product" class="xxx.Product" init-method="myInit"/>
销毁阶段(Spring 销毁对象前,会调用对象的销毁方法,完成销毁操作)
ctx.close()
执行销毁操作实现 DisposableBean 接口,重写方法完成销毁操作
public void destroy()throws Exception{
}
定义一个普通的销毁方法
public void myDestroy()throws Exception{
}
<bean id="" class="" init-method="" destroy-method="myDestroy"/>
scope = "singleton"
ctx.registerShutdownHook();
ctx.close();
<aside> <img src="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1398739b-f41e-4c5d-84f3-1cee4ee22c59/ChatGPT_logo.svg.webp" alt="https://s3-us-west-2.amazonaws.com/secure.notion-static.com/1398739b-f41e-4c5d-84f3-1cee4ee22c59/ChatGPT_logo.svg.webp" width="40px" /> 这两种关闭 Spring 容器的方法分别是:
ctx.registerShutdownHook()
: 这个方法会注册一个 JVM 关闭的钩子,当 JVM 关闭时会自动执行 Spring 容器的关闭操作。这个方法会在 JVM 关闭前保证 Spring 容器能够正确关闭并且清理资源。ctx.close()
: 这个方法会立即关闭 Spring 容器并且清理资源。这个方法不会等待正在执行的任务完成,可能会导致正在执行的任务被中断。所以,ctx.registerShutdownHook()
方法会在 JVM 关闭时优雅地关闭 Spring 容器,并且会等待正在执行的任务完成;而ctx.close()
方法会立即关闭 Spring 容器,可能会导致正在执行的任务被中断。
</aside>
<aside>
💡 简而言之 ctx.close()
的方法更暴力
</aside>