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、そこでcloseshutdownメソッド名

	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プロセスは、ポストプロセッサのような円形の依存関係など、何かの背後にある詳細の一部、伝播問題へのストレスを完了しました。

さて、今日ここに、私たちは自分自身の学習、限られた容量を理解し、偉大な神は見スプレーしないで、言い訳してください、助けの調査に希望と理解しています。

公開された235元の記事 ウォン称賛74 ビュー30000 +

おすすめ

転載: blog.csdn.net/wangwei19871103/article/details/105150569