[電源を入れる]春の豆のアンインストール

春の豆のアンロードが
発生します


グループの友人が尋ねた:Destoryは-方法の設定について、YMLを指定する方法をspringboot

まずアン豆の3つの形式が導入

カスタムDestoryは、方法は
org.springframework.beans.factory.DisposableBean又はjava.lang.AutoCloseable達成する
@Bean注釈、自動推論。プレゼンス近い()またはシャットダウン()が呼び出されたときに
アンロード豆の簡単な例では、次のルック

簡単なアンインストールの例
豆のエンティティ

パブリッククラスMyDisposeが実装閉鎖可能で{
@Override
公共ボイドクローズ()のIOException {スロー
するSystem.out.printlnは( "MyDispose执行关闭")。
}
}

applicationContext.xmlを

<Bean名= "disposeBean"クラス= "com.aya.mapper.model.MyDispose">
</豆>

测试类

@Test
公共ボイドtestApplicationContextGetBean(){
ClassPathXmlApplicationContext ClassPathXmlApplicationContext工場新しい新=( "applicationContext.xmlを");
factory.close();
}

コンソール出力:MyDispose閉じる行います

ソース解析
春を見つけるために、逆解析に続いては、Beanをアンインストールする方法です

-closeリバース
)(MyDispose.closeにブレークポイントを

アップdestroySingleton部分まで見て、コールスタック1つのレベルダウン

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

公共のボイドdestroySingleton(文字列のbeanName){
もしあれば//、指定された名前の登録シングルトンを削除します。
removeSingleton(のbeanName)。

。インスタンスは、対応DisposableBean //破壊
; DisposableBean DisposableBean
同期(this.disposableBeans){
//削除されたオブジェクトのセット、削除されたオブジェクトが返さ
DisposableBean =(DisposableBean)this.disposableBeans.remove(のbeanName);
}
//アンシフトをオブジェクトに加え
destroyBean(のbeanName、DisposableBean);
}

結論:this.disposableBeans.put場所に搬出豆場所を登録し、条件判断がなければなりません

リバース-参照を検索で
定義this.disposableBeansを見つけるために、民間最終地図<文字列、オブジェクト> disposableBeans =新しいのLinkedHashMap <>();

そして、すべての検索disposableBeans参照は、地域のコードを見つけるdisposableBeans.put

ボイドregisterDisposableBeanパブリック(文字列のbeanName、DisposableBean豆){
同期(this.disposableBeans){
this.disposableBeans.put(のbeanName、豆);
}
}

次に、registerDisposableBeanブレークポイント、同様に、スタックバック針

リバース-条件付き
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

保護された無効registerDisposableBeanIfNecessary(文字列のbeanName、オブジェクトBeanは、RootBeanDefinitionはMBD){
のAccessControlContext ACC =(System.getSecurityManager()=ヌルgetAccessControlContext():!?NULL);
//ビーン的範囲!=プロトタイプ&&必须是销毁的ビーン
するif(!mbd.isPrototype()&& requiresDestruction(豆、MBD)){
IF(mbd.isSingleton()){
//将のbeanName添加到this.disposableBeans
registerDisposableBean (のbeanName、
新しいDisposableBeanAdapter(豆、のbeanName、MBD、getBeanPostProcessors()、ACC))。
}
他{
//カスタムスコープの豆...
スコープスコープ= this.scopes.get(mbd.getScope())。
IF(スコープ== NULL){
新しい新しいIllegalStateExceptionがスロー( 'mbd.getScope +()+ "" "登録スコープなし名前範囲'");
}
scope.registerDestructionCallback(のbeanName、
新しい新しいDisposableBeanAdapter(豆、のbeanName、MBD、getBeanPostProcessors()、ACC));
}
}
}

次に、トラッキング条件決意のrequiresDestruction、ソース解析アン

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry

保護されたブールrequiresDestruction(@Nullableオブジェクト豆、RootBeanDefinition MBD){

リターン(!豆= NULL &&
(DisposableBeanAdapter.hasDestroyMethod(豆、MBD)||(hasDestructionAwareBeanPostProcessors()&&
DisposableBeanAdapter.hasApplicableProcessors(豆、getBeanPostProcessors()))));
}


条件は3つのグループに分かれて
1豆!= NULL
2.そこアンインストール豆
3.そこ豆と真DestructionAwareBeanPostProcessorの結果として実装方法のDestructionAwareBeanPostProcessor.requiresDestruction(豆)

豆のアンインストール方法
org.springframework.beans.factory.support.DisposableBeanAdapter

プライベート静的最終文字列CLOSE_METHOD_NAME =「近いです」。

プライベート静的最終文字列SHUTDOWN_METHOD_NAME =「シャットダウン」。

パブリック静的ブールhasDestroyMethod(オブジェクト・ビーン、RootBeanDefinition beanDefinition){
//实现`org.springframework.beans.factory.DisposableBean`或者` java.lang.AutoCloseable`
もし{(豆AutoCloseableのinstanceof DisposableBean ||豆のinstanceof)
trueを返します。
}
文字列destroyMethodName = beanDefinition.getDestroyMethodName()。
// @豆定义的豆。BeanDefinition的destoryMethodName = AbstractBeanDefinition.INFER_METHOD
IF(AbstractBeanDefinition.INFER_METHOD.equals(destroyMethodName)){

リターン(ClassUtils.hasMethod(bean.getClass()、CLOSE_METHOD_NAME)||
ClassUtils.hasMethod(bean.getClass()、SHUTDOWN_METHOD_NAME));
}
//カスタムメソッドDestoryは
StringUtils.hasLength(destroyMethodName)を返す;
}

ここまで私たちは、地区と結論します

org.springframework.beans.factory.DisposableBeanまたはjava.lang.AutoCloseable実装
@Bean注釈、自動推論。プレゼンス近い()またはシャットダウンすると、()が呼び出された
カスタムDestoryは、法の
問題のシーン
org.apache.commons.dbcp.BasicDataSource Destoryは、方法は、XMLで定義され、それがないYMLしなければならないのはなぜ?

XMLの内部では、destoryMethodNameプロパティのデフォルトのBeanDefinitionはnullに。

、@Bean Beanで定義され、BeanDefinitionが(推論)デフォルト属性をdestoryMethodName YML。

これは、手動でXMLを指定する必要があり、@Bean指定されていない、何のclose()メソッドまたはシャットダウンが存在しないと結論された場合でも、呼び出されています

自動定義
の簡単な説明を行うためのspringboot自動的に定義されたデータソースに関連するコンテンツ

spring.datasource.type、登録関連の豆がある場合

@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(名= "spring.datasource.type")
静的クラスジェネリック{

@Bean
パブリックデータソースデータソース(DataSourceProperties特性){
)(properties.initializeDataSourceBuilderを返す(構築)。
}

}

おすすめ

転載: www.cnblogs.com/exmyth/p/11668960.html