Jersey:纯依赖注入和全局(单例)对象

Jersey: Pure Dependency Injection and global (singleton) objects

我刚刚使用 Jersey 开始了我的第一个 Java REST 项目。

在这个项目中,我将实现纯依赖注入架构模式(又名穷人的依赖注入)。

如果我没理解错的话,将为每个传入的 HTTP 请求创建此 class 的一个新实例:

@Path("/v1")
public class ApiControllerV1 {

    @POST
    @Path("/measurements")
    public String newMeasurement() {
        // some code here
    }
}

我可以 "tie" 组合根的生命周期到 ApiControllerV1 的生命周期,但是我失去了在不同请求之间共享对象的能力。

因此,我需要找到一些 "global" 对象,我可以将其 "tie" 组合根。这个 "global" 对象应该可以从 ApiControllerV1 访问。我确信这样的物体存在,但直到现在我才找到它。请指出正确的方向(代码片段将不胜感激)。

您可以注册您的控制器实例。这样你就可以通过构造函数传递任何你想要的东西。如果您通过 class 注册或允许 Jersey 为您的控制器打包扫描,则每个请求实例化只是默认设置。但这不是强制性的

public class AppConfig extends ResourceConfig {
    public AppConfig() {
        final Whatever whatever = new Whatever();
        register(new Controller1(whatever));
        register(new Controller2(whatever));
    }
}

如果您使用 web.xml 进行配置,您可以通过

配置要使用的 AppConfig
<servlet>
    <servlet-name>Jersey</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.example.AppConfig</param-value>
    </init-param>
</servlet>

以前,您可能有类似

的东西
<init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.your.packages</param-value>
</init-param>

它允许 Jersey 扫描您的资源并为您注册它们。您可以摆脱它,因为现在我们自己在 AppConfig.

中注册所有内容

您需要使用 Jersey 配置的任何其他内容,都可以在 AppConfig 中执行。见 API for ResourceConfig

顺便说一句,您应该考虑使用 Jersey 已经提供的 DI 系统。它非常容易使用。