@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 | exposeProxyAopContext クラスを介して取得するために、プロキシを ThreadLocal として AOP フレームワークによって公開する必要があることを示します。 |
boolean | proxyTargetClass 標準の Java インターフェースベースのプロキシではなく、サブクラスベース(CGLIB)のプロキシを作成するかどうかを示します。 |
public abstract boolean proxyTargetClass
false です。public abstract boolean exposeProxy
AopContext クラスを介して取得するために、プロキシを ThreadLocal として AOP フレームワークによって公開する必要があることを示します。デフォルトではオフです。つまり、AopContext アクセスが機能するという保証はありません。