6

我正在使用 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();
    }
}
4

3 回答 3

5

在 hk2 的较晚版本中,它与 Jersey 集成(但很快就会集成),您可以拥有标记为 @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 要求 Jersey 默认启用 @Immediate 服务

于 2013-12-21T17:40:57.283 回答
0

编写 javax.servlet.ServletContextListener 的实现并将该侦听器添加到您的 Web xml。

http://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/

于 2013-12-21T01:03:38.550 回答
0

除了 msknapp 所说的之外,您还可以将@WebListener用于 servlet 上下文侦听器,这样您就不必将侦听器添加到 web.xml。然后你的听众看起来像

@WebListener
public class SomethingListener implements ServletContextListener {
    @Inject
    private final Something something;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //put code about something here
    }
}
于 2013-12-21T01:59:34.640 回答