我正在使用Jersey 2开发REST API,我需要在启动时实例化一些类,而不仅仅是在某些资源请求触发时实例化。

因此,我要问的是:如何实现在服务器启动时(而不是仅当有人命中某物时)创建下面定义的SomethingImpl实例?在Guice中,我将使用.asEagerSingleton()

应用:

public class MyApplication extends ResourceConfig {
    public MyApplication() {
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(" else").to(String.class);
                bind(SomethingImpl.class).to(Something.class).in(Singleton.class);
            }
        });

        register(SomeResource.class);
    }
}

某物:
public interface Something {
   String something();
}

public class SomethingImpl implements Something {
    @Inject
    public SomethingImpl(final String something) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    System.out.println(something() + something);

                    try {
                        Thread.sleep(4000);

                    } catch (final InterruptedException e) {
                        break;
                    }
                }
            }
        }).start();
    }

    @Override
    public String something() {
        return "Something";
    }
}

一些资源:
@Path("/")
public class SomeResource {
    private final Something something;

    @Inject
    public SomeResource(final Something something) {
        this.something = something;
    }

    @GET
    @Path("something")
    public String something() {
        return something.something();
    }
}

最佳答案

在比Jersey集成的更高版本的hk2中(但即将集成),您可以使用标记为@Immediate的服务。这些基本上一旦添加到hk2就可以开始使用。但是,为了使其正常工作,您将必须在系统中添加即时上下文(例如https://hk2.java.net/2.2.0-b27/apidocs/org/glassfish/hk2/utilities/ServiceLocatorUtilities.html#enableImmediateScope%28org.glassfish.hk2.api.ServiceLocator%29)

最好与Jersey团队进行游说,以默认情况下启用此范围/上下文对(它们已经启用了PerThread范围之类的功能)

我创建了以下问题:https://java.net/jira/browse/JERSEY-2291,请求默认情况下泽西启用@Immediate服务

10-07 23:35