第4章 应用部署和运行时环境 - 4.4. Configuring the Classpath Scanning 配置 Classpath 扫描

优质
小牛编辑
136浏览
2023-12-01

Jersey 使用一个公共 Java 服务提供者获得所有服务实现机制。这意味着Jersey 扫描整个类路径找到适当的 META-INF/services/files 。classpath 中越多的 jar 或者 war扫描可能会耗费更多时间。在使用中,您需要保存应用程序引导每一毫秒的时间,通常可以禁用在 Jersey 查找服务提供者。

Jersey 验证的 SPIs 列表

  • AutoDiscoverable (server, client) - 如果禁用加载服务,则 AutoDiscoverable 特性自动禁用
  • ForcedAutoDiscoverable (server, client) - Jersey 看起来总是加载这些自动发现功能即使服务是禁用的
  • HeaderDelegateProvider (server, client)
  • ComponentProvider (server)
  • ContainerProvider (server)
  • AsyncContextDelegateProvider (server/Servlet)

附加的 Jersey 验证的 SPIs 列表,以防 metainf-services 模块在 classpath 中

  • MessageBodyReader (server, client)
  • MessageBodyWriter (server, client)
  • ExceptionMapper (server, client)

因为可以配置所有SPI实现类或子类实例手动在您的应用程序,禁用服务在 Jersey 并不影响任何 Jersey 核心模块和扩展的功能,可以节省许多 在应用程序初始化期间,以换取更详细的应用程序配置代码。

服务查找在 Jersey(默认启用)可以通过一个 CommonProperties.METAINF_SERVICES_LOOKUP_DISABLE 属性来禁用。有一个客户端/服务器计数器部分,只有客户端或服务器上禁用该特性分别为:ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE/ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE。在所有其他情况下,客户端/服务器特殊属性将会被所关联的共同属性所覆盖,当设置的时候。

例如,下面的代码片断禁用服务提供者查找和手动注册的实现不同的JAX-RS 和 Jersey 提供的类型(ContainerRequestFilter, Feature, ComponentProviderContainerProvider)

Example 4.3. 通过 ResourceConfig 注册 SPI 实现

  1. ResourceConfig resourceConfig = new ResourceConfig(MyResource.class);
  2. resourceConfig.register(org.glassfish.jersey.server.filter.UriConnegFilter.class);
  3. resourceConfig.register(org.glassfish.jersey.server.validation.ValidationFeature.class);
  4. resourceConfig.register(org.glassfish.jersey.server.spring.SpringComponentProvider.class);
  5. resourceConfig.register(org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainerProvider.class);
  6. resourceConfig.property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true);

同样,在场景中的部署模型需要扩展应用程序的子类(如在所有的servlet容器部署),可以使用下面的代码来实现相同的应用程序配置:

  1. public class MyApplication extends ResourceConfig {
  2. public MyApplication() {
  3. register(org.glassfish.jersey.server.filter.UriConnegFilter.class);
  4. register(org.glassfish.jersey.server.validation.ValidationFeature.class);
  5. register(org.glassfish.jersey.server.spring.SpringComponentProvider.class);
  6. register(org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpContainerProvider.class);
  7. property(ServerProperties.METAINF_SERVICES_LOOKUP_DISABLE, true);
  8. }
  9. }