Java Jersey在绑定时构造类

时间:2016-11-25 21:09:32

标签: java dependency-injection jersey singleton hk2

我正在研究一些Java Jersey的东西,并希望做到以下几点;

我有一个名为SerialSubject的课程:

public class SerialSubject{
    private final SomeDatabase someDatabase;

    @Inject
    public SerialSubject(SomeDatabase someDatabase){
        this.someDatabase = someDatabase;
        initializeSerial();
    }

    InitializeSerial(){
        SerialConfig config = SomeDatabase.getConfig();
        //Open a Serial connection using this config
    }
}

我使用AbstractBinder绑定此类,并按照惯例将其注册到我的ResourceConfig。

bind(SerialSubject.class).to(SerialSubject.class).in(Singleton.class)

一切都很好,当资源请求并打开串行连接时,依赖关系得到解决。

现在需要注意的是:我想在启动时打开串口连接。有没有办法立即实例化该类?手动构建它不会,因为需要数据库(已经绑定到ioc)来检索配置。

1 个答案:

答案 0 :(得分:3)

您可以使用Immediate范围

  

立即是一个像javax.inject.Singleton作用域一样运行的作用域,除了在添加相应的Descriptor时创建实例。从定位器中删除相应的Descriptor后,Immediate范围服务将被销毁。特别是Immediate范围服务如果调用ServiceHandle.destroy()方法,则不会被销毁。应注意将服务注入即时服务,因为它们也会成为虚拟即时服务

bind(SerialSubject.class).to(SerialSubject.class).in(Immediate.class)

您还需要配置ServiceLocator以启用直接范围。

public class JerseyApplication extends ResourceConfig {

    @Inject
    public JerseyApplication(ServiceLocator locator) {
        ServiceLocatorUtilities.enableImmediateScope(locator);
    }
}

另见: