繁体   English   中英

带有参数的Jersey构造函数

[英]Jersey constructor with parameters

我想在使用Jersey开发的RESTful服务中使用DAO,因此应通过服务的构造函数注入DAO实现:

@Path("eventscheduler)
public class EventSchedulerService {
    private IEventSchedulerDao dao;

    public EventSchedulerService(IEventSchedulerDao dao) { this.dao = dao; }
}

但是,我知道Jersey希望默认的构造函数可以正确设置所有内容。 我一直试图弄清楚如何做到这一点,但令人惊讶的是,这似乎是一个罕见的案例,我想知道人们是如何将DAO注入其服务中的,或者根本上不涉及注入的。

我怎样才能做到这一点?

如果您使用的是Jersey 2,它将使用HK2作为其DI框架。 所有资源类在构造时都会经历DI生命周期。 而且构造函数注入不是问题。

使任意对象可注射的最基本方法(使用Jersey)是绑定到AbstractBinder

public class Binder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(EventSchedudlerDaoImpl.class).to(EventSchedulerDao.class);
    }
}

然后在泽西岛注册活页夹

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(new Binder());
    }
}

然后,您只需要通过在构造函数顶部添加@Inject来声明注入点。

@Inject
public EventSchedulerService(EventSchedulerDao dao) {
    this.dao = dao;
}

至于活页夹实现,绑定语法基本上读为

bind( Implementation ).to( Contract ).in( Scope );

bind方法可以采用实例,也可以采用类。 提供实例时,范围自动为Singleton。

to方法指定广告合同,这是可以在注入点声明的类型。 在这种情况下,仅接口EventSchedulerDao可以用于注入点。 如果您没有界面,则可以

bindAsContract(EventSchedulerDao.class)

假设EventSchedulerDao是实现类。

可用的范围是PerLookupRequestScopedSingleton 如果未指定,默认范围将是PerLookup ,这意味着将为每个注入点创建一个新的服务实例。 您应该已经知道Singleton含义。 RequestScoped意味着将为每个请求创建一个新实例,该实例可能与PerLookup ,因为服务可能会在整个请求生命周期的多个点被注入。

也可以看看:

您必须使用javax.inject.Inject注释类构造函数(或属性本身)。

import javax.inject.Inject;

class EventSchedulerResource {
  private final IEventSchedulerDao dao;

  @Inject
  public EventSchedulerResource(IEventSchedulerDao dao) {
    this.dao = dao;
  }

  // ...

}

如果IEventScheduler是接口,则必须创建一个扩展org.glassfish.jersey.server.ResourceConfig的配置类类,并使用bind(EventSchedulerDaoImpl.class).to(IEventScheduler.class)注册接口的绑定到具体实现bind(EventSchedulerDaoImpl.class).to(IEventScheduler.class)此处: https//jersey.java.net/documentation/latest/ioc.html第23.1章)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM