17詳細な春の5.xのソーストリップ三〇から二getBeanは、コールバックを破壊します
コールバックを破壊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.
registerDisposableBean(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
else {//自定义的,注册到Scope
// 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.registerDestructionCallback(beanName,
new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
}
}
}
requiresDestruction
方法は、登録の破壊があるかどうかをチェックし、メソッド名があること、または持つことができますがありDestructionAwareBeanPostProcessor
裁判官にプロセッサを。
protected boolean requiresDestruction(Object bean, RootBeanDefinition mbd) {
return (bean.getClass() != NullBean.class &&
(DisposableBeanAdapter.hasDestroyMethod(bean, mbd) || (hasDestructionAwareBeanPostProcessors() &&
DisposableBeanAdapter.hasApplicableProcessors(bean, getBeanPostProcessors()))));
}
hasDestroyMethod破壊メソッド名のDisposableBeanAdapter
実装DisposableBean
およびAutoCloseable
インタフェース、又はINFER_METHOD
等しくdestroyMethodName
、そこでclose
、shutdown
メソッド名
public static boolean hasDestroyMethod(Object bean, RootBeanDefinition beanDefinition) {
if (bean instanceof DisposableBean || bean instanceof AutoCloseable) {
return true;
}
String destroyMethodName = beanDefinition.getDestroyMethodName();
if (AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)) {
return (ClassUtils.hasMethod(bean.getClass(), CLOSE_METHOD_NAME) ||
ClassUtils.hasMethod(bean.getClass(), SHUTDOWN_METHOD_NAME));
}
return StringUtils.hasLength(destroyMethodName);
}
DisposableBeanAdapter的hasApplicableProcessors
プロセッサは、ケースに対処する必要がある場合。
public static boolean hasApplicableProcessors(Object bean, List<BeanPostProcessor> postProcessors) {
if (!CollectionUtils.isEmpty(postProcessors)) {
for (BeanPostProcessor processor : postProcessors) {
if (processor instanceof DestructionAwareBeanPostProcessor) {
DestructionAwareBeanPostProcessor dabpp = (DestructionAwareBeanPostProcessor) processor;
if (dabpp.requiresDestruction(bean)) {
return true;
}
}
}
}
return false;
}
DefaultSingletonBeanRegistry的registerDisposableBean
実際には、bean
登録中に、タイムライン上のコールバックへ。
public void registerDisposableBean(String beanName, DisposableBean bean) {
synchronized (this.disposableBeans) {
this.disposableBeans.put(beanName, bean);
}
}
前回は、コンテナの破壊が呼び出されます。
破壊され得るbean
:
コールバック:
このような基本的なgetBean
プロセスは、ポストプロセッサのような円形の依存関係など、何かの背後にある詳細の一部、伝播問題へのストレスを完了しました。
さて、今日ここに、私たちは自分自身の学習、限られた容量を理解し、偉大な神は見スプレーしないで、言い訳してください、助けの調査に希望と理解しています。