我正在使用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();
}
}
答案 0 :(得分:5)
在hk2的后续版本中,与Jersey集成(但很快将集成),您可以获得标记为@Immediate的服务。这些基本上都会在添加到hk2后立即开始。但是,为了使其工作,您必须将Immediate上下文添加到系统中(例如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服务
答案 1 :(得分:0)
编写javax.servlet.ServletContextListener的实现,并将该侦听器添加到web xml。
http://www.mkyong.com/servlet/what-is-listener-servletcontextlistener-example/
答案 2 :(得分: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
}
}