春のコア技術(7)

論文を接続:春のコア技術を(6)

バージョン5.1.8.RELEASE

1.6カスタムBeanの特徴

スプリングフレームワークは、インターフェイスの数は、Beanのプロパティをカスタマイズするために使用することができる提供します。次のようにこのセクションでは、彼らはグループ化されています:

1.6.1ライフサイクルコールバック

容器の豆ライフサイクル管理と相互作用することがスプリングを達成することができるInitializingBeanDisposableBeanのインターフェイスを。容器は、前者を呼び出しafterPropertiesSet()、後者は、destroy()豆は、初期化と豆の破壊時に特定のアクションを実行できるようにします。

JSR-250 @PostConstruct@PreDestroyノートは、一般的に近代的なSpringアプリケーションのコールバックでライフサイクルを受信するためのベストプラクティスと考えています。あなたのBeanが特定の春のインタフェースに結合されないことを意味し、これらのアノテーションを使用してください。詳細については、使用@PostConstructと@PreDestroyを

内部には、スプリングフレームワークを使用してBeanPostProcessorそれを見つけることができる任意のコールバックインターフェースを処理し、適切なメソッドを呼び出すために実装します。あなたが提供されていないデフォルトの機能や他の春のライフサイクルの動作をカスタマイズする必要がある場合、彼らは自分を達成することができますBeanPostProcessor詳細については、を参照してくださいコンテナ拡張ポイント

初期化と破棄のコールバックに加えて、春には、オブジェクトも実装することができ、管理Lifecycle、これらのオブジェクトは、コンテナ自体駆動起動と停止の手順のライフサイクルに参加できるように、インターフェイスを。

このセクションでは、ライフサイクル・コールバック・インタフェースについて説明します。

初期化コールバック

org.springframework.beans.factory.InitializingBeanBeanインタフェースは、すべての必要な特性は完全に後に初期化のために容器内に配置可能にします。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設定を使用する場合は、使用することができますプロパティを。参照受信ライフサイクルコールバックを次の定義を考えてみます。@BeandestroyMethod

<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設定を使用している場合、これはデフォルトの動作であることに注意してください。

デフォルトの初期化と破壊方法

あなたは春特有の使用していない場合はInitializingBeanDisposableBean一般的に使用されるコールバック・インターフェースの初期化と破棄コールバックメソッドを書くのに時間が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のライフサイクル挙動制御オプションがあります。

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オブジェクトが(おそらくそれが実行されている他のプロセスに依存するため)を起動して、最初のピットストップは続かなければならない示します。位相値を考慮すると、どんな「通常」のために達成しないことを知ることも重要である、デフォルト値をオブジェクトをしたがって、任意の負の値は、これらの標準コンポーネントまでオブジェクトフェーズが開始(およびそれらの後に停止)する必要があることを示しています。任意の正の位相値が逆になっています。SmartLifecycleLifecycle0

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 ApplicationContextAwareBeanNameAware

ときにApplicationContext達成するために作成されたorg.springframework.context.ApplicationContextAwareときに、インタフェースオブジェクト・インスタンスを、あろうApplicationContextそのインスタンスへの参照を提供します。以下のリストは示しApplicationContextAwareインタフェースの定義を:

public interface ApplicationContextAware {

    void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
}

したがって、BeanができApplicationContext(例えば、他の特徴は、開示されたこのサブクラス変換インタフェースまたはインタフェースを介して既知の基準となるConfigurableApplicationContextプログラムでそれらを操作作成しました)ApplicationContext1つの使用は、他のBeanを取得するようにプログラムすることがあります。この機能は便利な場合があります。しかし、共同研究者は、Beanに提供されているため、一般的には、避けるべきであると反転制御に結合された春のコードでは、属性としてスタイルに従っていません。ApplicationContextファイルリソース、イベント、およびアクセス公開アプリケーションへのアクセスを提供する他の方法MessageSourceこれらの追加機能ApplicationContextの追加機能の説明。

スプリング2.5、別の取得自動組立開始ApplicationContext基準法。「伝統的な」constructorbyType自動組立モード(例えば、自動組立共同編集者が前記)それぞれコンストラクタ引数またはパラメータセッターメソッド提供されてもよいApplicationContextタイプに依存。柔軟性、および自動的にマルチパラメータフィールドと得る方法をアセンブルする能力について、新たな注釈ベースの自動アセンブリ機能を使用します。関連するフィールド場合は、コンストラクタまたはメソッドで@Autowiredのニーズや注釈付きApplicationContextタイプ、ApplicationContext自動的にフィールド、またはプロセスパラメータのコンストラクタの引数をロードします。詳細については、使用します@Autowired

場合ApplicationContextインプリメンテーションを作成するorg.springframework.beans.factory.BeanNameAwareときにクラスインターフェースは、参照の名前に対応するそれに関連付けられたオブジェクトのクラス定義を提供します。以下のリストは示しBeanNameAwareインタフェースの定義を:

public interface BeanNameAware {

    void setBeanName(String name) throws BeansException;
}

通常Beanプロパティの修正後に、しかし、例えば、初期化コールバックの前InitializingBeanafterPropertiesSetまたはカスタム初期化方法。

1.6.3その他のAwareインターフェイス

加えてApplicationContextAware、及びBeanNameAware(でに論じ)、スプリングは、広い提供Aware豆容器は、それらがいくつかのインフラストラクチャの依存関係が必要であることを示しできるようにプルバックします。一般的なルールとして、名前は依存関係の種類を表します。次の表は、最も重要まとめたAwareインタフェースを:

名前 依存関係を注入します 説明
ApplicationContextAware 声明 ApplicationContext ApplicationContextAwareBeanNameAware
ApplicationEventPublisherAware ApplicationContextの時間は、出版社が含まれて ApplicationContextののその他の特徴
BeanClassLoaderAware クラスをロードするBeanのクラスローダ ビーンのインスタンス化
BeanFactoryAware 声明たBeanFactory ApplicationContextAwareBeanNameAware
BeanNameAware 豆の文の名前 ApplicationContextAwareBeanNameAware
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をコンテナにアクセスする必要があることをお勧めします。

おすすめ

転載: www.cnblogs.com/aotian/p/11445886.html