「自動プロキシ」機能を使用する

これまで、ProxyFactoryBean または同様のファクトリ Bean を使用して、AOP プロキシの明示的な作成を検討してきました。

Spring では、選択した Bean 定義を自動的にプロキシできる「自動プロキシ」Bean 定義も使用できます。これは、Spring の「Bean ポストプロセッサー」インフラストラクチャ上に構築されており、コンテナーのロード時に Bean 定義を変更できます。

このモデルでは、XML Bean 定義ファイルに特別な Bean 定義を設定して、自動プロキシインフラストラクチャを構成します。これにより、自動プロキシに適格なターゲットを宣言できます。ProxyFactoryBean を使用する必要はありません。

これを行うには 2 つの方法があります。

  • 現在のコンテキストの特定の Bean を参照する自動プロキシクリエーターを使用します。

  • 個別に考慮するに値する自動プロキシ作成の特殊なケース: ソースレベルのメタデータ属性によって駆動される自動プロキシ作成。

自動プロキシ Bean 定義

このセクションでは、org.springframework.aop.framework.autoproxy パッケージが提供する自動プロキシ作成者について説明します。

BeanNameAutoProxyCreator

BeanNameAutoProxyCreator クラスは、リテラル値またはワイルドカードに一致する名前を持つ Bean の AOP プロキシを自動的に作成する BeanPostProcessor です。次の例は、BeanNameAutoProxyCreator Bean を作成する方法を示しています。

<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
	<property name="beanNames" value="jdk*,onlyJdk"/>
	<property name="interceptorNames">
		<list>
			<value>myInterceptor</value>
		</list>
	</property>
</bean>

ProxyFactoryBean と同様に、プロトタイプアドバイザーの正しい動作を可能にするために、インターセプターのリストではなく interceptorNames プロパティがあります。「インターセプター」という名前は、アドバイザーまたは任意のアドバイス型です。

一般的な自動プロキシの場合と同様に、BeanNameAutoProxyCreator を使用する主なポイントは、最小限の構成で同じ構成を複数のオブジェクトに一貫して適用することです。これは、宣言型トランザクションを複数のオブジェクトに適用するための一般的な選択肢です。

上記の例の jdkMyBean および onlyJdk など、名前が一致する Bean 定義は、ターゲットクラスを持つ単純な古い Bean 定義です。AOP プロキシは、BeanNameAutoProxyCreator によって自動的に作成されます。同じアドバイスが、一致するすべての Bean に適用されます。(前の例のインターセプターではなく)advisor が使用される場合、ポイントカットは異なる Bean に異なる方法で適用される場合があることに注意してください。

DefaultAdvisorAutoProxyCreator

より一般的で非常に強力な自動プロキシ作成者は DefaultAdvisorAutoProxyCreator です。これは、自動プロキシアドバイザーの Bean 定義に特定の Bean 名を含める必要なく、現在のコンテキストで適格なアドバイザーを自動的に適用します。BeanNameAutoProxyCreator と同じ一貫性のある構成と重複の回避というメリットがあります。

このメカニズムの使用には以下が含まれます。

  • DefaultAdvisorAutoProxyCreator Bean 定義の指定。

  • 同じコンテキストまたは関連するコンテキストで任意の数のアドバイザを指定します。これらは、インターセプターやその他のアドバイスではなく、アドバイザーでなければならないことに注意してください。これは、Bean 定義の候補に対する各アドバイスの適格性をチェックするために、評価するポイントカットが必要なため必要です。

DefaultAdvisorAutoProxyCreator は、各アドバイザーに含まれるポイントカットを自動的に評価し、各ビジネスオブジェクト(例の businessObject1 や businessObject2 など)に適用するアドバイス(ある場合)を確認します。

これは、任意の数のアドバイザーを各ビジネスオブジェクトに自動的に適用できることを意味します。アドバイザーのいずれのポイントカットもビジネスオブジェクトのメソッドと一致しない場合、オブジェクトはプロキシされません。Bean 定義は新しいビジネスオブジェクトに追加されるため、必要に応じて自動的にプロキシされます。

一般に、自動プロキシには、呼び出し元または依存関係が非推奨オブジェクトを取得できないようにするという利点があります。この ApplicationContext で getBean("businessObject1") を呼び出すと、ターゲットビジネスオブジェクトではなく、AOP プロキシが返されます。(前述の「内部 Bean」イディオムもこの利点を提供します。)

次の例では、DefaultAdvisorAutoProxyCreator Bean と、このセクションで説明する他の要素を作成します。

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
	<property name="transactionInterceptor" ref="transactionInterceptor"/>
</bean>

<bean id="customAdvisor" class="com.mycompany.MyAdvisor"/>

<bean id="businessObject1" class="com.mycompany.BusinessObject1">
	<!-- Properties omitted -->
</bean>

<bean id="businessObject2" class="com.mycompany.BusinessObject2"/>

DefaultAdvisorAutoProxyCreator は、多くのビジネスオブジェクトに同じアドバイスを一貫して適用する場合に非常に便利です。インフラストラクチャの定義が整ったら、特定のプロキシ構成を含めずに新しいビジネスオブジェクトを追加できます。また、構成の変更を最小限に抑えて、追加のアスペクト(トレースやパフォーマンス監視のアスペクトなど)を簡単にドロップできます。

DefaultAdvisorAutoProxyCreator は、フィルタリング(同じファクトリで複数の異なる構成の AdvisorAutoProxyCreators の使用を許可する特定のアドバイザーのみが評価されるように命名規則を使用することによる)および順序付けのサポートを提供します。アドバイザは、org.springframework.core.Ordered インターフェースを実装して、これが課題である場合に正しい順序を確保できます。前の例で使用した TransactionAttributeSourceAdvisor には、構成可能な順序値があります。デフォルト設定は順不同です。