繁体   English   中英

休息服务的应用程序类生命周期是什么?

[英]What is that Application class lifecycle of a rest service?

每个休息服务都是从扩展该应用程序类并定义应用程序路径开始的吗? 该应用程序类本身的生命周期是多少? 下面是一个例子:

import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("resources")
public class ApplicationConfig extends Application {}

这是一个servlet吗? 它永远活着吗? 我该如何理解这门课? 是cdi豆吗? 服务器是否在每个请求上创建这个类?

什么是Application

Application是 JAX-RS 提供的一个与部署无关的抽象类,用于配置和注册 JAX-RS 应用程序的组件,它还用于为应用程序提供额外的元数据。

Application是可以使用@Context注释注入的类型之一。 有关更多详细信息,请参阅此答案

Application子类

Application子类可以实现诸如getClasses()getSingletons()getProperties()来配置和注册组件和属性。

Application子类可以用@ApplicationPath注释,定义 JAX-RS 资源类(用@Path注释的类)的基本 URI。 Application子类在 Web 应用程序启动时实例化一次,并由 JAX-RS 运行时管理。

最简单的实现可能如下:

@ApplicationPath("api")
public SampleApplication extends Application {

}

在上面的示例中,没有注册资源类或提供者,因此 JAX-RS 运行时将扫描 JAX-RS 组件的类路径并自动注册它们。

但是,根据Jakub Podlesak 的这篇文章,不鼓励在生产环境中使用这种方法:

上面的例子效果很好。 启动时,应用程序只扫描实际的类路径,并将在那里找到的每个 JAX-RS 组件类添加到实际的运行时配置中。 是不是很棒? 坦率地说,这种配置可以正常工作。 直到有人更改系统配置(系统类路径)或应用程序的打包方式(然后可以从应用程序类路径中添加/删除新的第 3 方组件)。 这些更改可能超出您的控制,如果其中之一发生,您的应用程序配置可能会中断。 因此,在生产环境中使用这种配置是不明智的。

Jersey 是 JAX-RS 参考实现,提供了ResourceConfig类。 Application相比, ResourceConfig提供了高级功能来简化 JAX-RS 组件的注册,例如扫描提供的类路径或一组包名称中的根资源和提供程序类等。更多详细信息,请参阅Jersey 文档.

使用多个Application子类

还值得一提的是,您并不受限于每个 Web 应用程序的单个Application子类。 同一个 WAR 可以有多个Application子类。 有关更多详细信息,请查看Adam Bien 的这篇文章

要在一个 WAR 中部署多个具有不同 URI 的 JAX-RS 应用程序,您必须为每个这样的应用程序创建一个javax.ws.rs.core.Application子类(或为此使用web.xml )。 显然,Java EE 中普遍存在的配置约定(或异常配置)不再起作用:您必须通过覆盖方法getClassesgetSingletons来显式配置每个子类中的资源:

 @Path("first") public class FirstResource { @GET public String first() { return "first"; } }
 @ApplicationPath("one") public class JAXRSConfigurationOne extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(FirstResource.class); return resources; } }
 @Path("second") public class SecondResource { @GET public String first() { return "second"; } }
 @ApplicationPath("two") public class JAXRSConfigurationTwo extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> resources = new HashSet<>(); resources.add(SecondResource.class); return resources; } }

两个 JAX-RS 应用程序都可以通过不同的 URI 访问: http://localhost:8080/multiple-roots/one/firsthttp://localhost:8080/multiple-roots/two/second

如果不存在Application子类怎么办?

如果不存在Application子类,则需要 JAX-RS 实现添加 servlet 并将其名称设置为javax.ws.rs.Application并自动发现必须与应用程序一起打包的所有资源类和提供者。

有关更多详细信息,请查看JAX-RS 2.1 规范的第 2 章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM