Spring版本
5.2.5.RELEASE
源码解读
在《Spring源码解析(八)-创建单例bean》的doCreateBean方法的最后一步,调用了registerDisposableBeanIfNecessary
进行了bean的销毁逻辑的注册
1 AbstractAutowireCapableBeanFactory#registerDisposableBeanIfNecessary
protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
// 获取访问控制上下文
AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
if (!mbd.isPrototype() && requiresDestruction(bean, mbd)) {
if (mbd.isSingleton()) {
// 单例模式
// Register a DisposableBean implementation that performs all destruction
// work for the given bean: DestructionAwareBeanPostProcessors,
// DisposableBean interface, custom destroy method.
// 为给定bean注册一个可以执行包括DestructionAwareBeanPostProcessors、DisposableBean接口,自定义销毁方法的DisposableBean实现
// 往disposableBeans缓存map写入beanName和DisposableBeanAdapter的映射关系
registerDisposableBean(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
else {
// 其他模式
// A bean with a custom scope...
Scope scope = this.scopes.get(mbd.getScope());
if (scope == null) {
throw new IllegalStateException("No Scope registered for scope name '" + mbd.getScope() + "'");
}
// 交由自定义的scope进行销毁逻辑
scope.registerDestructionCallback(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
}
}
如果是单例模式,构造一个DisposableBeanAdapter
对象,之后,将<beanName,构造出来的DisposableBeanAdapter对象>写入缓存map
如果是其他模式,则交由scope进行销毁逻辑的处理
网友评论