带参数

时间:2016-06-03 11:18:26

标签: java rest dependency-injection jersey dao

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

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

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

但是,我知道Jersey希望默认构造函数能够正确设置所有内容。我一直试图弄清楚如何做这一段时间,但令人惊讶的是,这似乎是一个不常见的案例,我想知道人们如何将DAO注入他们的服务,或者根本不处理注射。

我该怎么做?

2 个答案:

答案 0 :(得分:5)

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

使用任意对象可注入的最基本方式(使用Jersey)是绑定在AbstractBinder

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

然后用Jersey

注册活页夹
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方法可以接受一个实例,也可以接受一个类。当您提供实例时,Scope将自动为Singleton。

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

bindAsContract(EventSchedulerDao.class)

假设EventSchedulerDao是实现类。

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

另见:

答案 1 :(得分:0)

您必须使用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)的具体实现(请参阅此处:{{3第23.1)章