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

时间:2017-05-04 14:43:58

标签: java dependency-injection jersey jersey-2.0

我刚刚使用Jersey启动了我的第一个Java REST项目。

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

如果我理解正确,将为每个传入的HTTP请求创建此类的新实例:

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

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

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

因此,我需要找到一些"全球"我可以" tie"组成根。这"全球"对象应该可以从ApiControllerV1访问。我确定这样的物体存在,但直到现在我都找不到它。请指出我正确的方向(将非常感谢代码片段。)

1 个答案:

答案 0 :(得分:2)

您可以注册控制器的实例。这样你就可以通过构造函数传递任何你想要的东西。每个请求实例化只是默认值,如果您按类注册或允许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系统。这很容易使用。