【问题标题】:Java Jersey construct class at bind timeJava Jersey 在绑定时构造类
【发布时间】:2016-11-25 21:09:32
【问题描述】:

我正在研究一些 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)来检索配置。

【问题讨论】:

    标签: java dependency-injection jersey singleton hk2


    【解决方案1】:

    您可以使用Immediate 范围

    Immediate 是一个类似于javax.inject.Singleton 作用域的作用域,除了实例在其对应的Descriptors 添加后立即创建。当从定位器中删除相应的Descriptor 时,Immediate 范围服务将被销毁。特别是如果调用ServiceHandle.destroy() 方法,Immediate 范围服务不会被破坏。应该小心注入到即时服务中的服务,因为它们也会成为虚拟即时服务

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

    您还需要配置ServiceLocator 以启用直接作用域。

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

    另请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-02
      • 2016-10-14
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多