2013-02-08 22 views
5

Belirli bir sorunu çözmek için AOP kullanmam gerekiyor, ancak küçük bir bağımsız Java programı (Java EE kabı yok).Java SE ortamında javax.interceptor kullanmak mümkün mü?

javax.interceptor işlevlerini kullanabilir miyim, yoksa bazı üçüncü taraf AOP uygulamalarını indirmem gerekiyor mu? Mümkünse Java SE SDK ile birlikte gelenleri kullanmayı tercih ederim.

cevap

2

Herhangi bir türde bir kap kullanmıyorsanız, uygulamanız için Java EE interceptor API'sinin bir uygulaması olmayacaktır. Bunun yerine, çevrimiçi olarak büyük miktarda öğretici ve örnek bulunan AspectJ gibi bir AOP çözümü kullanmayı düşünmelisiniz. Bununla birlikte, en yeni sürümleri ve en iyi uygulamaları takip eden örneklere bağlı kalmaya özen göstereceğim, çünkü orada çok fazla eski şey var.

Yay çerçevesini zaten kullanıyorsanız, Spring AOP gereksinimlerinizi karşılayabilir. AspectJ'in tüm özelliklerini size vermese de, bu, uygulamanıza entegre edilmek için çok daha kolay olacaktır.

5

Java SE'de CDI'yi kullanabilirsiniz, ancak kendi uygulamanızı sağlamalısınız. İşte referans uygulamasını kullanarak bir örnek - Weld:

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(); 
    } 
} 

sınıf için tek ektir:

<dependency> 
    <groupId>org.jboss.weld.se</groupId> 
    <artifactId>weld-se</artifactId> 
    <version>1.1.10.Final</version> 
</dependency> 

açıklama:

package foo; 
import java.lang.annotation.*; 
import javax.interceptor.InterceptorBinding; 

@Inherited @InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ ElementType.METHOD, ElementType.TYPE }) 
public @interface Guarded {} 

keseni uygulaması:

package foo; 
import javax.interceptor.*; 

@Guarded @Interceptor 
public class Guard { 
    @AroundInvoke 
    public Object intercept(InvocationContext invocationContext) throws Exception { 
    return "intercepted"; 
    } 
} 

Tanımlayıcı:

<!-- 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> 
İlgili konular