@TargetSE(valueSE=TYPESE) @RetentionSE(valueSE=RUNTIMESE) @DocumentedSE @Import(value=org.springframework.context.annotation.AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy
<aop:aspectj-autoproxy>
XML 要素にある機能と同様に、AspectJ の @Aspect
アノテーションでマークされたコンポーネントの処理のサポートを有効にします。次のように @Configuration
クラスで使用されます。@Configuration @EnableAspectJAutoProxy public class AppConfig { @Bean public FooService fooService() { return new FooService(); } @Bean public MyAspect myAspect() { return new MyAspect(); } }ここで、
FooService
は典型的な POJO コンポーネントであり、MyAspect
は @Aspect
スタイルの側面です。public class FooService { // various methods }
@Aspect public class MyAspect { @Before("execution(* FooService+.*(..))") public void advice() { // advise FooService methods as appropriate } }上記のシナリオでは、
@EnableAspectJAutoProxy
は、MyAspect
が適切に処理され、FooService
が貢献するアドバイスでプロキシ化されることを保証します。 ユーザーは、proxyTargetClass()
属性を使用して、FooService
用に作成されるプロキシの型を制御できます。以下は、デフォルトのインターフェースベースの JDK プロキシアプローチとは対照的に、CGLIB スタイルの「サブクラス」プロキシを有効にします。
@Configuration @EnableAspectJAutoProxy(proxyTargetClass=true) public class AppConfig { // ... }
@Aspect
Bean は、他のコンポーネントと同様にコンポーネントスキャンされる場合があることに注意してください。@Aspect
と @Component
の両方でアスペクトをマークするだけです:
package com.foo; @Component public class FooService { ... } @Aspect @Component public class MyAspect { ... }次に、@
ComponentScan
アノテーションを使用して両方を取得します。@Configuration @ComponentScan("com.foo") @EnableAspectJAutoProxy public class AppConfig { // no explicit @Bean definitions required }注:
@EnableAspectJAutoProxy
はローカルアプリケーションコンテキストにのみ適用され、異なるレベルで Bean の選択的プロキシを許可します。動作を複数のレベルで適用する必要がある場合は、@EnableAspectJAutoProxy
を個々のコンテキスト、たとえば、共通ルート Web アプリケーションコンテキストや個別の DispatcherServlet
アプリケーションコンテキストで再宣言してください。 この機能を使用するには、クラスパスに aspectjweaver
が存在する必要があります。この依存関係は、一般に spring-aop
ではオプションですが、@EnableAspectJAutoProxy
およびその基礎となる機能には必須です。
Aspect
修飾子と型 | オプションの要素と説明 |
---|---|
boolean | exposeProxy AopContext クラスを介して取得するために、プロキシを ThreadLocal として AOP フレームワークによって公開する必要があることを示します。 |
boolean | proxyTargetClass 標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。 |
public abstract boolean proxyTargetClass
false
です。public abstract boolean exposeProxy
AopContext
クラスを介して取得するために、プロキシを ThreadLocal
として AOP フレームワークによって公開する必要があることを示します。デフォルトではオフです。つまり、AopContext
アクセスが機能するという保証はありません。