2013-02-08 16 views
5

特定の問題を解決するためにAOPを使用する必要がありますが、それは小さなスタンドアロンのJavaプログラム(Java EEコンテナなし)です。Java SE環境でjavax.interceptorを使用できますか?

javax.interceptor機能を使用できますか、サードパーティのAOP実装をダウンロードする必要がありますか?可能であれば、Java SE SDKに付属のものを使用したいと思います。

答えて

2

いずれかの種類のコンテナを使用していない場合は、Java EEインターセプタAPIがアプリケーションで使用できるようになりません。

代わりに、AspectJのようなAOPソリューションを使用するようにしてください。そのためには、チュートリアルとオンラインのサンプルが大量にあります。しかし、古いバージョンのものがたくさんあるので、最新バージョンとベストプラクティスに従ったサンプルに固執しようとします。

すでにSpringフレームワークを使用している場合は、Spring AOPが要件を満たしている可能性があります。これはAspectJのすべての機能を提供するわけではありませんが、アプリケーションに統合するのがはるかに簡単です。

5

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> 
関連する問題