如何在Jetty中将共享库传递给ResourceConfig?

时间:2019-05-13 22:39:12

标签: jersey jetty embedded-jetty

我正在编写一个小型的嵌入式Jetty Web服务器,但是我有一个共享对象,该对象的结构很昂贵,我不希望对servlet的每个请求都必须重新构建该对象。不幸的是,我在Jetty中添加资源的方式是通过ResourceConfig构造函数,但是除了添加类名之外,这不允许我做任何事情:

 // instantiate this expensive object
 MyExpensiveSharedObjectClass myExpensiveSharedObject = new MyExpensiveSharedObjectClass();
 String result = myExpensiveSharedObject.search("alpha");

 // set up the service
 final ResourceConfig resourceConfig = new ResourceConfig(MyService.class);

然后MyService.java包含您的标准声明,例如:

    @GET
    @Path("/doSomething")
    @Produces(MediaType.APPLICATION_JSON)
    public String doSomething() {
        // do stuff with myExpensiveSharedObject....except how do I get to it??
        // String result = myExpensiveSharedObject.search("alpha");

理想情况是,每次请求进入/doSomething时,我都可以对之前创建的myExpensiveSharedObject对象执行方法。

我想这很简单,但是我找不到实现此目的的简单方法。

或者-是否有一种方法在Jetty servlet中具有某种形式的共享内存空间?我注意到,每个请求似乎都实例化了servlet的新实例,因此,例如,我无法在对象中建立可被该类的所有实例重用的共享内存映射。我确信这是可能的,但我不知道该怎么做。

基本上,我只是试图找到一种构造昂贵的对象的方法,这种方法在构造方法中很理想,或者传递给servlet本身,但是在这些servlet的上下文中,构造方法是呼叫了每个请求,所以我不能走那条路。

1 个答案:

答案 0 :(得分:1)

我认为您遇到的是球衣问题,而不是跳船的问题(但您可能还会遇到两者的问题!)。查看Dependency injection with Jersey 2.0是否有助于您了解如何将依赖项注入资源类。如果是这样,那么您应该可以

bind(myExpensiveSharedObject).to(MyExpensiveSharedObjectClass.class)

在AbstractBinder实现中,然后您可以通过执行

向球衣的ResourceConfig注册
resourceConfig.register(binder)