【问题标题】:Is it possible to use javax.interceptor in a Java SE environment?是否可以在 Java SE 环境中使用 javax.interceptor?
【发布时间】:2013-02-08 17:15:40
【问题描述】:

我需要使用 AOP 来解决特定问题,但它是一个小型独立 Java 程序(没有 Java EE 容器)。

我可以使用javax.interceptor 功能,还是必须下载一些第 3 方 AOP 实现?如果可能的话,我宁愿使用 Java SE SDK 附带的东西。

【问题讨论】:

    标签: java jakarta-ee aop cdi


    【解决方案1】:

    您可以在 Java SE 中使用 CDI,但您必须提供自己的实现。这是一个使用参考实现的示例 - 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();
      }
    }
    

    类路径的唯一补充是:

    <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>
    

    【讨论】:

    • 这是正确的答案,但我有一个问题。当我在类级别使用拦截器注释时,我得到一个异常“不满足的依赖关系”你有什么建议吗?
    【解决方案2】:

    如果您不使用任何类型的容器,那么您的应用程序将无法使用 Java EE 拦截器 API 的实现。

    您应该改用 AspectJ 之类的 AOP 解决方案,网上有大量的教程和示例。但是,我会小心地尝试坚持遵循最新版本和最佳实践的示例,因为那里有很多旧的东西。

    如果您已经在使用 Spring 框架,那么 Spring AOP 可能会满足您的要求。这将更容易集成到您的应用程序中,尽管它没有为您提供 AspectJ 的所有功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2023-02-24
      • 1970-01-01
      相关资源
      最近更新 更多