可以在JavaSE环境中使用javax.interceptor吗?
我需要使用AOP来解决一个特定的问题,但它是一个小型的独立Java程序(没有JavaEE容器)可以在JavaSE环境中使用javax.interceptor吗?,java,jakarta-ee,aop,cdi,Java,Jakarta Ee,Aop,Cdi,我需要使用AOP来解决一个特定的问题,但它是一个小型的独立Java程序(没有JavaEE容器) 我可以使用javax.interceptor功能,还是必须下载一些第三方AOP实现?如果可能的话,我宁愿使用Java SE SDK附带的工具。如果您没有使用任何类型的容器,那么您的应用程序将无法实现Java EE拦截器API 相反,您应该考虑使用像AspectJ这样的AOP解决方案,因为在线上有大量的教程和示例。然而,我会小心地尝试坚持使用最新版本和最佳实践的示例,因为那里有很多旧的东西 如果您已经在
我可以使用
javax.interceptor
功能,还是必须下载一些第三方AOP实现?如果可能的话,我宁愿使用Java SE SDK附带的工具。如果您没有使用任何类型的容器,那么您的应用程序将无法实现Java EE拦截器API
相反,您应该考虑使用像AspectJ这样的AOP解决方案,因为在线上有大量的教程和示例。然而,我会小心地尝试坚持使用最新版本和最佳实践的示例,因为那里有很多旧的东西
如果您已经在使用Spring框架,那么Spring AOP可能会满足您的需求。这将非常容易集成到您的应用程序中,尽管它没有提供AspectJ的所有功能。您可以在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 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>
foo.警卫
这是正确的答案,但我有一个问题。当我在类级别使用拦截器注释时,我得到一个异常“未满足的依赖项”。您有什么建议吗?
<!-- 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>