ApplicationContext关闭后Spring Bean的状态及持有其引用的非Spring对象相关问题
关于Spring容器关闭后Bean的状态与使用问题解答
咱们一个个来拆解你的疑问:
1. Spring Bean Bean1对象会发生什么变化?是否会在ApplicationContext关闭后立即被垃圾回收?
当你执行((ConfigurableApplicationContext)appCtx).close();关闭容器时,Spring会触发Bean的销毁生命周期流程:
- 会调用Bean1上标注的
@PreDestroy方法(如果有定义的话) - 如果Bean1实现了
DisposableBean接口,它的destroy()方法会被执行 - 要是你在
bean.xml里给Bean1配置了destroy-method,对应的自定义销毁方法也会被调用
不过,Bean1对象本身并不会立刻消失。至于垃圾回收的时机,完全由JVM的垃圾回收机制说了算:
- 只要你的非Spring对象还持有Bean1的引用,JVM就不会把它标记为可回收对象
- 只有当所有指向Bean1的引用都被释放(比如你的非Spring对象被回收,或者你主动把引用置为
null),JVM才会在合适的时机(比如内存不足时)回收Bean1占用的内存
2. 持有Bean1对象的引用,是否仍可正常使用该对象?还是引用会变为NULL?
放心,你的引用变量不会自动变成NULL。Spring关闭容器只是完成Bean的销毁动作(比如释放它内部管理的数据库连接、线程池等资源),但Bean1对象本身还好好待在内存里。
你完全可以继续通过持有的引用调用Bean1的方法,不过有个小提醒:如果Bean1在销毁过程中已经释放了某些依赖资源,那调用依赖这些资源的方法可能会抛出异常(比如调用一个需要数据库连接的方法,而连接已经被关闭了)。但对象本身是可用的,引用也不会凭空失效。
内容的提问来源于stack exchange,提问作者hagrawal7777
相关产品推荐
相关产品推荐

