2013-02-08 16 views
5

Ho bisogno di utilizzare AOP per risolvere un problema particolare, ma si tratta di un piccolo programma Java standalone (senza contenitore Java EE).È possibile utilizzare javax.interceptor in un ambiente Java SE?

Posso utilizzare la funzionalità javax.interceptor o devo scaricare qualche implementazione AOP di terze parti? Preferisco usare quello che viene fornito con l'SDK Java SE se possibile.

risposta

2

Se non si utilizza un contenitore di alcun tipo, non sarà disponibile un'implementazione dell'API Java Interceptor API per l'applicazione.

Si dovrebbe invece cercare di utilizzare una soluzione AOP come AspectJ, per la quale è disponibile una grande quantità di tutorial ed esempi online. Tuttavia, farei attenzione a cercare di attenermi agli esempi che seguono le versioni più recenti e le best practice poiché ci sono molte vecchie cose là fuori.

Se si utilizza già il framework Spring, Spring AOP potrebbe soddisfare le proprie esigenze. Questo sarà significativamente più facile da integrare nella tua applicazione, anche se non ti offre tutte le funzionalità di AspectJ.

5

È possibile utilizzare CDI in Java SE ma è necessario fornire la propria implementazione. Ecco un esempio utilizzando l'implementazione di riferimento - 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(); 
    } 
} 

L'unica aggiunta al percorso di classe è:

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

L'annotazione: implementazione

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

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

Interceptor:

package foo; 
import javax.interceptor.*; 

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

Descrittore:

<!-- 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> 
Problemi correlati