什么是rest服务的应用程序类生命周期?
大家好我是新来的rest和jax-rs所以我的问题是每个rest服务开始扩展该应用程序类和定义应用程序路径。 现在我的问题是该应用程序类本身的生命周期是什么? 这是一个例子:
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资源类的基本URI(使用@Path
注释的类)。 当Web应用程序启动时, Application
子类会立即执行一次,并且它们由JAX-RS运行时管理。
最简单的实现如下:
@ApplicationPath("api") public SampleApplication extends Application { }
在上面的示例中,没有注册资源类或提供程序,因此JAX-RS运行时将扫描JAX-RS组件的类路径并自动注册它们。
但是,根据Jakub Podlesak的这篇文章 ,在生产环境中不鼓励采用这种方法:
以上示例效果很好。 启动时,应用程序只扫描实际的类路径,并将在那里找到的每个JAX-RS组件类添加到实际的运行时配置中。 不是很棒吗? 坦率地说,这种配置可以正常工作。 在有人更改系统配置(系统类路径)或应用程序打包方式之前(可以在应用程序类路径中添加/删除新的第三方组件)。 这些更改可能超出您的控制范围,如果其中一个发生,您的应用程序配置可能会中断。 因此,在生产环境中使用这种配置是不明智的。
Jersey,JAX-RS参考实现,提供ResourceConfig
类。 与Application
相比, ResourceConfig
提供了简化JAX-RS组件注册的高级function,例如在提供的类路径或一组包名称中扫描根资源和提供程序类等。有关更多详细信息,请参阅Jersey文档 。
使用多个Application
子类
还值得一提的是,您不限于每个Web应用程序的单个Application
子类。 同一个WAR可以有多个Application
子类。 有关更多详细信息,请查看Adam Bien的这篇文章 :
要在一个WAR中部署具有不同URI的多个JAX-RS应用程序,您必须为每个此类应用程序创建一个
javax.ws.rs.core.Application
子类(或者为此目的使用web.xml
)。 显然,Java EE无处不在的约定优于配置(或exception配置)不再适用:您必须通过重写方法getClasses
或getSingletons
来显式配置每个子类中的资源:@Path("first") public class FirstResource { @GET public String first() { return "first"; } }
@ApplicationPath("one") public class JAXRSConfigurationOne extends Application { @Override public Set
> getClasses() { Set > 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
> getClasses() { Set > resources = new HashSet<>(); resources.add(SecondResource.class); return resources; } } 两个JAX-RS应用程序都可以通过不同的URI访问:
http://localhost:8080/multiple-roots/one/first
和http://localhost:8080/multiple-roots/two/second
如果没有Application
子类,该怎么办?
如果不存在Application
子类,则需要JAX-RS实现添加servlet并将其名称设置为javax.ws.rs.Application
并自动发现必须与应用程序打包在一起的所有资源类和提供程序。
有关更多详细信息,请查看JAX-RS 2.1规范的第2章。