特定の問題を解決するためにAOPを使用する必要がありますが、それは小さなスタンドアロンのJavaプログラム(Java EEコンテナなし)です。Java SE環境でjavax.interceptorを使用できますか?
javax.interceptor
機能を使用できますか、サードパーティのAOP実装をダウンロードする必要がありますか?可能であれば、Java SE SDKに付属のものを使用したいと思います。
特定の問題を解決するためにAOPを使用する必要がありますが、それは小さなスタンドアロンのJavaプログラム(Java EEコンテナなし)です。Java SE環境でjavax.interceptorを使用できますか?
javax.interceptor
機能を使用できますか、サードパーティのAOP実装をダウンロードする必要がありますか?可能であれば、Java SE SDKに付属のものを使用したいと思います。
いずれかの種類のコンテナを使用していない場合は、Java EEインターセプタAPIがアプリケーションで使用できるようになりません。
代わりに、AspectJのようなAOPソリューションを使用するようにしてください。そのためには、チュートリアルとオンラインのサンプルが大量にあります。しかし、古いバージョンのものがたくさんあるので、最新バージョンとベストプラクティスに従ったサンプルに固執しようとします。
すでにSpringフレームワークを使用している場合は、Spring AOPが要件を満たしている可能性があります。これはAspectJのすべての機能を提供するわけではありませんが、アプリケーションに統合するのがはるかに簡単です。
Java SEではCDIを使用できますが、独自の実装を提供する必要があります。ここでリファレンス実装を使用した例です - ウェルド:
package foo;
import org.jboss.weld.environment.se.Weld;
public class Demo {
public static class Foo {
@Guarded public String invoke() {
return "Hello, World!";
}
}
public static void main(String[] args) {
Weld weld = new Weld();
Foo foo = weld.initialize()
.instance()
.select(Foo.class)
.get();
System.out.println(foo.invoke());
weld.shutdown();
}
}
クラスパスにのみ添加である:
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>1.1.10.Final</version>
</dependency>
注釈:
package foo;
import java.lang.annotation.*;
import javax.interceptor.InterceptorBinding;
@Inherited @InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface Guarded {}
インターセプタ実装:
package foo;
import javax.interceptor.*;
@Guarded @Interceptor
public class Guard {
@AroundInvoke
public Object intercept(InvocationContext invocationContext) throws Exception {
return "intercepted";
}
}
ディスクリプタ:
<!-- META-INF/beans.xml -->
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<interceptors>
<class>foo.Guard</class>
</interceptors>
</beans>