論文を接続:春のコア技術を(6)
バージョン5.1.8.RELEASE
1.6カスタムBeanの特徴
スプリングフレームワークは、インターフェイスの数は、Beanのプロパティをカスタマイズするために使用することができる提供します。次のようにこのセクションでは、彼らはグループ化されています:
1.6.1ライフサイクルコールバック
容器の豆ライフサイクル管理と相互作用することがスプリングを達成することができるInitializingBean
とDisposableBean
のインターフェイスを。容器は、前者を呼び出しafterPropertiesSet()
、後者は、destroy()
豆は、初期化と豆の破壊時に特定のアクションを実行できるようにします。
JSR-250
@PostConstruct
と@PreDestroy
ノートは、一般的に近代的なSpringアプリケーションのコールバックでライフサイクルを受信するためのベストプラクティスと考えています。あなたのBeanが特定の春のインタフェースに結合されないことを意味し、これらのアノテーションを使用してください。詳細については、使用@PostConstructと@PreDestroyを。
内部には、スプリングフレームワークを使用してBeanPostProcessor
それを見つけることができる任意のコールバックインターフェースを処理し、適切なメソッドを呼び出すために実装します。あなたが提供されていないデフォルトの機能や他の春のライフサイクルの動作をカスタマイズする必要がある場合、彼らは自分を達成することができますBeanPostProcessor
。詳細については、を参照してくださいコンテナ拡張ポイント。
初期化と破棄のコールバックに加えて、春には、オブジェクトも実装することができ、管理Lifecycle
、これらのオブジェクトは、コンテナ自体駆動起動と停止の手順のライフサイクルに参加できるように、インターフェイスを。
このセクションでは、ライフサイクル・コールバック・インタフェースについて説明します。
初期化コールバック
org.springframework.beans.factory.InitializingBean
Beanインタフェースは、すべての必要な特性は完全に後に初期化のために容器内に配置可能にします。InitializingBean
インターフェイスは、メソッドを提供します。
void afterPropertiesSet() throws Exception;
私たちは、使用することはお勧めしませんInitializingBean
コードは春に結合する必要がないため、インターフェイスを。また、当社は、使用をお勧め@PostConstruct
注釈をPOJOや初期化メソッドを指定します。XMLベースの構成メタデータの場合、使用できるinit-method
プロパティをメソッド名なしなし戻りパラメータの署名を指定します。Java設定を使用する場合は、使用することができます@Bean
注釈initMethod
プロパティを。参照受信ライフサイクルコールバックを。次の例を考えてみます。
<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init"/>
public class ExampleBean {
public void init() {
// do some initialization work
}
}
前の例次の例は、(二つのリスト)とほぼ同じです。
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements InitializingBean {
public void afterPropertiesSet() {
// do some initialization work
}
}
しかし、上記の2つの例は、最初の例は、コードスプリングに結合されていません。
破壊コールバック
実装org.springframework.beans.factory.DisposableBean
インターフェイスは、それが破壊された容器内に含まれている場合、Beanがコールバックを取得することができます。DisposableBean
インターフェイスは、メソッドを提供します。
void destroy() throws Exception;
私たちは、の使用はお勧めしませんDisposableBean
コードは春に結合する必要がないため、コールバックインタフェースを。また、当社は、使用することをお勧め@PreDestroy
注釈や豆ジェネリックメソッドの定義がサポートを指定します。XMLベースの構成メタデータを使用するときは、使用することができる<bean/>
要素のdestroy-method
属性を。Java設定を使用する場合は、使用することができますプロパティを。参照受信ライフサイクルコールバックを。次の定義を考えてみます。@Bean
destroyMethod
<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>
public class ExampleBean {
public void cleanup() {
// do some destruction work (like releasing pooled connections)
}
}
前の定義は、以下の定義とほぼ同じです。
<bean id="exampleInitBean" class="examples.AnotherExampleBean"/>
public class AnotherExampleBean implements DisposableBean {
public void destroy() {
// do some destruction work (like releasing pooled connections)
}
}
しかし、上記の2つの例は、最初の例は、コードスプリングに結合されていません。
あなたはできる
<bean>
要素がdestroy-method
自動的に検出し、特定の共通Beanクラスの春を示す属性値の特定(推定)値を指定するclose
か、shutdown
方法。(任意の実装java.lang.AutoCloseable或java.io.Closeable
クラスを一致させることができます。)また、中にできる<beans>
要素default-destroy-method
この動作には、この特別な(おそらく)の値を設定(プロパティを参照してください豆のセット全体に適用されるデフォルトの初期化や破壊方法を)。Java設定を使用している場合、これはデフォルトの動作であることに注意してください。
デフォルトの初期化と破壊方法
あなたは春特有の使用していない場合はInitializingBean
とDisposableBean
一般的に使用されるコールバック・インターフェースの初期化と破棄コールバックメソッドを書くのに時間がinit()
、initialize()
、dispose()
方法を命名するように。すべての開発者が同じメソッド名を使用し、一貫性を確保するように理想的には、このようなライフサイクル・コールバック・メソッドの名前は、プロジェクトで一貫しています。
あなたは、各Bean「見た目」にSpringコンテナと命名された初期設定を設定し、コールバックメソッド名を破壊することができます。これは、アプリケーション開発者として、あなたはアプリケーションクラスを書くことができますし、使用することを意味init()
ごとにBean定義を設定せずに、初期化コールバックとしてinit-method="init"
属性。(に応じてBeanを作成するときにスプリングIoCコンテナは、このメソッドを呼び出す前に説明したコールバック標準ライフサイクル)。この機能は、初期化と破壊コールバックメソッドに一貫性のある命名規則を適用します。
あなたの初期化コールバックメソッドは、指定されたと仮定init()
して、コールバックメソッドの名前は破壊しますdestroy()
。次の例のようにあなたのクラス:
public class DefaultBlogService implements BlogService {
private BlogDao blogDao;
public void setBlogDao(BlogDao blogDao) {
this.blogDao = blogDao;
}
// this is (unsurprisingly) the initialization callback method
public void init() {
if (this.blogDao == null) {
throw new IllegalStateException("The [blogDao] property must be set.");
}
}
}
あなたは、次のような豆でそれを使用することができます。
<beans default-init-method="init">
<bean id="blogService" class="com.something.DefaultBlogService">
<property name="blogDao" ref="blogDao" />
</bean>
</beans>
トップは、<beans/>
要素が上に存在するdefault-init-method
鉛春のIoCコンテナは、Beanクラスと呼ばれる属性のinit
認識方法初期化コールバックメソッド。Beanが作成され、組み立てられたときにBeanクラスは、このような方法を持っている場合、それは適切な時に呼び出されます。
また、使用してXMLのトップできる<beans/>
要素default-destroy-method
破壊法のコールバックを設定するプロパティを。
クラスがすでに大会のコールバックメソッドと一致し、既存のBeanを持っている場合は、XMLで単独で使用することができる<bean/>
にinit-method
し、destroy-method
デフォルト値属性はメソッドの名前を指定し上書きします。
SpringコンテナはすぐにBeanとしてすべての依存関係を提供した後に設定された初期化コールバックと呼ばれることが保証することができます。したがって、そのようにAOPインターセプタとはBeanを適用されていないことを意味呼び出し、上で参照原豆初期化コールバックです。まず、(インターセプタチェーン付きなど、)完全に客観豆、AOPプロキシの、アプリケーションを作成します。ターゲットBeanとプロキシが個別に定義されている場合は、あなたのコードであっても、元のターゲットBeanとの対話へのプロキシをバイパスすることができます。そのため、initメソッドで使用されるインターセプタは、Beanのライフサイクルは、その代理人、またはインターセプタに結合されたターゲットになりそうするため、適切ではない、とターゲットBean元のコードに奇妙なセマンティクスとの直接的な相互作用のパフォーマンス。
組み合わせたライフ・サイクル・機械
春2.5の当初から、次の3つのBeanのライフサイクル挙動制御オプションがあります。
- でInitializingBeanとDisposableBeanコールバックインタフェース
- カスタム
init()
およびdestroy()
方法 @PostConstruct
そして@PreDestroy
ノート。あなたは豆を制御するために、これらのメカニズムの組み合わせを指定することができます。
Beanのライフサイクル設定機構の複数の実行、及びそれぞれの順序がメソッド名の異なる機構で構成されている場合、このような構成の方法に従って各注釈に記載されています。機構(例えば、名前の初期化方法の複数のライフサイクルのメソッドと同じ名前で設定されている場合しかし、
init()
など)、1記載の方法は、一度実行されます。
豆の同一構成の異なる初期化方法の複数、以下の順序で実行する場合:
@PostConstruct
注釈付きメソッドInitializingBean
定義されたafterPropertiesSet()
コールバックインタフェース- カスタム設定
init()
方法
破壊方法は、同じ順序で呼び出します。
@PreDestroy
注釈付きメソッドDisposableBean
定義されたdestroy()
コールバックインタフェース- カスタム設定
destroy()
方法
起動とシャットダウンコールバック
Lifecycle
独自のライフサイクルの要件を(例えば、いくつかのバックグラウンド・プロセスの開始などとストップ)基本的なメソッドを定義している任意のオブジェクトのためのインタフェース:
public interface Lifecycle {
void start();
void stop();
boolean isRunning();
}
どれ春管理対象オブジェクトを実装することができますLifecycle
インターフェイスを。ときに、ApplicationContext
(例えば、実行時停止/再起動シーンのための)開始を受信し、信号を停止すると、それはカスケード接続のコンテキストで定義されたコールLifecycle
のすべての実装。するためにそれを委任することにより、LifecycleProcessor
以下のリストに示すように、実装されます
public interface LifecycleProcessor extends Lifecycle {
void onRefresh();
void onClose();
}
ことに注意してくださいLifecycleProcessor
、それはそれ自体がLifecycle
拡張インターフェース。また、文脈に応じて更新され、近くには、2つの他の方法が追加されます。
従来のことに注意してください
org.springframework.context.Lifecycle
インタフェースは簡単なプロトコル明示的に自動的にコンテキストの更新を開始することを意味するものではありません、通知を起動および停止です。(開始段階を含む)特定のBean自動起動きめ細かく制御し、実装することを検討org.springframework.context.SmartLifecycle
。
また、前に破壊停止が通知を受け取ることを保証することはできませんのでご了承ください。閉じたとき、従来、全てのLifecycle
豆一般破壊コールバック停止通知の最初の受信者の開始前。しかし、ホットフラッシュまたはリフレッシュしようとしたときに一時停止のライフサイクルのコンテキストで、破壊の唯一のメソッドを呼び出します。
起動とシャットダウンの呼び出し順序は重要です。任意の2つのオブジェクト間の「依存」関係が存在する場合は、依存者は、その依存関係の後に開始され、その依存関係の前に停止します。しかし、時々 、直接の依存性は不明です。あなただけのいくつかのタイプのオブジェクトは、オブジェクトの別の種類の前に開始する必要があります知っているかもしれません。これらのケースでは、SmartLifecycle
インタフェースは、別のオプション、すなわち界面親定義Phased
で定義された方法をgetPhase()
。以下は示しPhased
インタフェースの定義を:
public interface Phased {
int getPhase();
}
以下は示しSmartLifecycle
インタフェースの定義を:
public interface SmartLifecycle extends Lifecycle, Phased {
boolean isAutoStartup();
void stop(Runnable callback);
}
起動時に、オブジェクトが最初のスタートの最低レベルを持っています。停止した場合には、逆の順番に従ってください。したがって、達成するためにSmartLifecycle
オブジェクトとgetPhase()
復帰することはInteger.MIN_VALUE
、オブジェクトの開始する最初と最後のストップになります。別のエリアでは、位相値は、Integer.MAX_VALUE
オブジェクトが(おそらくそれが実行されている他のプロセスに依存するため)を起動して、最初のピットストップは続かなければならない示します。位相値を考慮すると、どんな「通常」のために達成しないことを知ることも重要である、デフォルト値をオブジェクトを。したがって、任意の負の値は、これらの標準コンポーネントまでオブジェクトフェーズが開始(およびそれらの後に停止)する必要があることを示しています。任意の正の位相値が逆になっています。SmartLifecycle
Lifecycle
0
SmartLifecycle
ストップ定義されたメソッドは、コールバックを受け入れます。いずれの実装では、実装のクローズ処理が完了した後にコールバックを呼び出す必要がありますrun()
方法。これ可能になり、非同期は、必要なときに閉じLifecycleProcessor
インタフェースのデフォルト実装は、DefaultLifecycleProcessor
コールバックを呼び出すために、各期間内のタイムアウト値ターゲットグループを待機します。段階ごとに30秒のデフォルトのタイムアウト。この文脈で名前を付けることができますが定義されているlifecycleProcessor
デフォルトの寿命プロセッサインスタンスBeanを上書きします。あなたがタイムアウトを変更したい場合は、以下のように定義する十分でしょう。
<bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
<!-- timeout value in milliseconds -->
<property name="timeoutPerShutdownPhase" value="10000"/>
</bean>
前述のように、LifecycleProcessor
インタフェースはリフレッシュするために使用される方法及びクロージングコールバックコンテキストを定義します。コールをオフ駆動するディスプレイと同様後者の手順stop()
が、コンテキストが閉じているときにのみ発生します。一方、「リフレッシュ」コールバックが有効になってSmartLifecycle
豆の別の特徴を。あなたは、コンテキストを更新すると(後にすべてのオブジェクトをインスタンス化し、初期化)、コールバックを呼び出します。プロセッサチェックのこの場合、デフォルトのライフサイクルの各SmartLifecycle
オブジェクトのisAutoStartup()
メソッドによって返されたブール値。それがある場合はtrue
、そのオブジェクトではなく、明示的なコールコンテキストや、独自のを待つよりも、開始することでしたstart()
方法(異なるコンテキストを更新し、コンテキストは、標準実装のコンテキストで発生自動的に起動しません)。phase
値は、先行するいずれかの関係「依存」タイプとに応じて起動シーケンスを決定します。
非Webアプリケーションで優雅に春のIoCコンテナをシャットダウン
このセクションでは、非Webアプリケーションにのみ適用されます。ばねWebベースの
ApplicationContext
関連コンテナスプリングIoCのWebアプリケーションが閉じられたときにコードが正常に閉じることができると実装が関連しています。
あなたは(クライアントのデスクトップ環境で、例えば)非Webアプリケーション環境でのSpring IoCコンテナを使用している場合、JVMはシャットダウンフックを登録して使用します。そうすることで、正常なシャットダウンを保証し、すべてのリソースを解放するために、破壊シングルトンBeanの関連するメソッドを呼び出します。あなたは適切に設定し、これらの破壊コールバックを実装する必要があります。
シャットダウンフックを登録するには、呼び出しConfigurableApplicationContext
インタフェース上の文をregisterShutdownHook()
次の例に示すように、この方法:
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public final class Boot {
public static void main(final String[] args) throws Exception {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
// add a shutdown hook for the above context...
ctx.registerShutdownHook();
// app runs here...
// main method exits, hook is called prior to the app shutting down...
}
}
1.6.2 ApplicationContextAware
とBeanNameAware
ときにApplicationContext
達成するために作成されたorg.springframework.context.ApplicationContextAware
ときに、インタフェースオブジェクト・インスタンスを、あろうApplicationContext
そのインスタンスへの参照を提供します。以下のリストは示しApplicationContextAware
インタフェースの定義を:
public interface ApplicationContextAware {
void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}
したがって、BeanができApplicationContext
(例えば、他の特徴は、開示されたこのサブクラス変換インタフェースまたはインタフェースを介して既知の基準となるConfigurableApplicationContext
プログラムでそれらを操作作成しました)ApplicationContext
。1つの使用は、他のBeanを取得するようにプログラムすることがあります。この機能は便利な場合があります。しかし、共同研究者は、Beanに提供されているため、一般的には、避けるべきであると反転制御に結合された春のコードでは、属性としてスタイルに従っていません。ApplicationContext
ファイルリソース、イベント、およびアクセス公開アプリケーションへのアクセスを提供する他の方法MessageSource
。これらの追加機能ApplicationContext
の追加機能の説明。
スプリング2.5、別の取得自動組立開始ApplicationContext
基準法。「伝統的な」constructor
とbyType
自動組立モード(例えば、自動組立共同編集者が前記)それぞれコンストラクタ引数またはパラメータセッターメソッド提供されてもよいApplicationContext
タイプに依存。柔軟性、および自動的にマルチパラメータフィールドと得る方法をアセンブルする能力について、新たな注釈ベースの自動アセンブリ機能を使用します。関連するフィールド場合は、コンストラクタまたはメソッドで@Autowired
のニーズや注釈付きApplicationContext
タイプ、ApplicationContext
自動的にフィールド、またはプロセスパラメータのコンストラクタの引数をロードします。詳細については、使用します@Autowired
。
場合ApplicationContext
インプリメンテーションを作成するorg.springframework.beans.factory.BeanNameAware
ときにクラスインターフェースは、参照の名前に対応するそれに関連付けられたオブジェクトのクラス定義を提供します。以下のリストは示しBeanNameAware
インタフェースの定義を:
public interface BeanNameAware {
void setBeanName(String name) throws BeansException;
}
通常Beanプロパティの修正後に、しかし、例えば、初期化コールバックの前InitializingBean
、afterPropertiesSet
またはカスタム初期化方法。
1.6.3その他のAware
インターフェイス
加えてApplicationContextAware
、及びBeanNameAware
(で前に論じ)、スプリングは、広い提供Aware
豆容器は、それらがいくつかのインフラストラクチャの依存関係が必要であることを示しできるようにプルバックします。一般的なルールとして、名前は依存関係の種類を表します。次の表は、最も重要まとめたAware
インタフェースを:
名前 | 依存関係を注入します | 説明 |
---|---|---|
ApplicationContextAware | 声明 ApplicationContext |
ApplicationContextAware と BeanNameAware |
ApplicationEventPublisherAware | ApplicationContextの時間は、出版社が含まれて | ApplicationContextののその他の特徴 |
BeanClassLoaderAware | クラスをロードするBeanのクラスローダ | ビーンのインスタンス化 |
BeanFactoryAware | 声明たBeanFactory | ApplicationContextAware と BeanNameAware |
BeanNameAware | 豆の文の名前 | ApplicationContextAware と BeanNameAware |
BootstrapContextAware | コンテナリソースアダプタランニングBootstrapContext 。唯一のインスタンスで通常利用できるのApplicationContextは、JCAをサポートしています |
JCA CCI |
LoadTimeWeaverAware | ウィーバーロード時の処理のためのクラス定義で定義され | AspectJので織ったときSpringフレームワークにロードされました |
MessageSourceAware | 構成されたメッセージポリシー(パラメータのサポートと国際化)を解析するための | ApplicationContextののその他の特徴 |
NotificationPublisherAware | 春のJMX通知出版社 | お知らせ |
ResourceLoaderAware | リソース構成ローダーへの低レベルアクセスのための | リソース |
ServletConfigAware | 現在のコンテナの操作ServletConfig 。ウェブのみApplicationContext で有効 |
Spring MVCの |
ServletContextAware | 現在のコンテナの操作ServletContext 。ウェブのみApplicationContext で有効 |
Spring MVCの |
これらのインタフェースの使用はあなたのコードやAPIのカップリング春を行いますと、IOCの基準に従わないことに改めて注意してください。したがって、我々は、彼らがプログラム的インフラBeanをコンテナにアクセスする必要があることをお勧めします。
- マイCSDN:https://blog.csdn.net/liweitao7610
- 私のブログの庭:https://www.cnblogs.com/aotian/
- 私のジェーン・ブック:https://www.jianshu.com/u/6b6e162f1fdc