Spring AOP の機能とゴール

Spring AOP は、純粋な Java で実装されています。特別なコンパイルプロセスは必要ありません。Spring AOP はクラスローダー階層を制御する必要がないため、サーブレットコンテナーまたはアプリケーションサーバーでの使用に適しています。

Spring AOP は現在、メソッド実行のジョインポイント(Spring Bean でのメソッドの実行をアドバイスする)のみをサポートしています。フィールドインターセプトは実装されていませんが、コア Spring AOP API を壊すことなくフィールドインターセプトのサポートを追加できます。フィールドアクセスをアドバイスし、ジョインポイントを更新する必要がある場合は、AspectJ などの言語を検討してください。

Spring AOP の AOP へのアプローチは、他のほとんどの AOP フレームワークのアプローチとは異なります。目的は、最も完全な AOP 実装を提供することではありません(ただし、Spring AOP は非常に優れています)。むしろ、AOP 実装と Spring IoC を密接に統合して、エンタープライズアプリケーションの一般的な問題を解決することを目的としています。

たとえば、Spring Framework の AOP 機能は通常、Spring IoC コンテナーと組み合わせて使用されます。アスペクトは、通常の Bean 定義構文を使用して構成されます (これにより、強力な「自動プロキシ」機能が可能になります)。これは、他の AOP 実装との決定的な違いです。Spring AOP では、非常に細かいオブジェクト (通常はドメインオブジェクト) へのアドバイスなど、いくつかのことを簡単または効率的に行うことができません。このような場合、AspectJ が最適です。ただし、私たちの経験では、Spring AOP は、AOP に適したエンタープライズ Java アプリケーションのほとんどの問題に対して優れたソリューションを提供します。

Spring AOP は、包括的な AOP ソリューションを提供するために AspectJ と競合することは決してありません。Spring AOP などのプロキシベースのフレームワークと AspectJ などの本格的なフレームワークの両方に価値があり、競合するものではなく、補完的なものであると考えています。Spring は、Spring AOP および IoC を AspectJ とシームレスに統合し、一貫した Spring ベースのアプリケーションアーキテクチャ内で AOP のすべての使用を可能にします。この統合は、Spring AOP API または AOP Alliance API には影響しません。Spring AOP は下位互換性を維持します。Spring AOP API の説明については、次の章を参照してください。

Spring Framework の中心的な教義の 1 つは、非侵襲性です。これは、フレームワーク固有のクラスとインターフェースをビジネスモデルまたはドメインモデルに強制的に導入するべきではないという考え方です。ただし、一部の場所では、Spring Framework は、Spring フレームワーク固有の依存関係をコードベースに導入するオプションを提供します。そのようなオプションを提供する理由は、特定のシナリオでは、そのようなメソッドで特定の機能の一部を読んだりコーディングしたりするのが簡単です。ただし、Spring Framework(ほとんど)は常に選択肢を提供します。特定のユースケースまたはシナリオに最適なオプションについて、十分な情報に基づいて判断することができます。

この章に関連するそのような選択の 1 つは、どの AOP フレームワーク(およびどの AOP スタイル)を選択するかです。AspectJ、Spring AOP、またはその両方を選択できます。また、@AspectJ アノテーションスタイルのアプローチまたは Spring XML 構成スタイルのアプローチのいずれかを選択できます。この章が最初に @AspectJ スタイルのアプローチを導入することを選択したという事実は、Spring チームが Spring XML 構成スタイルよりも @AspectJ アノテーションスタイルのアプローチを好むことを示すものと解釈すべきではありません。

各スタイルの長所と短所の詳細については、使用する AOP 宣言スタイルの選択を参照してください。