【发布时间】:2017-06-22 05:34:21
【问题描述】:
为了在启动时初始化应用程序,我扩展了ServletContextListener:
@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
... initialization code here
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
现在我想将初始化逻辑提取到一个独立的StartupManager 类中,并从MyServletContextListener 委托给这个类:
public class StartupManager {
public void performStartup() {
... initialization code here
}
}
我尝试通过简单地添加@Inject 注释将StartupManager 注入ServletContextListener:
@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {
@Inject StartupManager mStartupManager;
@Override
public void contextInitialized(ServletContextEvent sce) {
mStartupManager.performStartup();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
这不起作用 - 调用 contextInitialized(ServletContextEvent ) 时引用为空。
然后我想我可能要注册一个活页夹:
@ApplicationPath("")
public class MyResourceConfig extends ResourceConfig {
public MyResourceConfig() {
register(new DependencyInjectionBinder());
}
}
public class DependencyInjectionBinder extends AbstractBinder {
@Override
protected void configure() {
bind(StartupManager.class).to(StartupManager.class);
}
}
这也不起作用。
我的问题是如何将依赖项注入ServletContextListener?最好是构造函数注入,但是字段注入也可以。
【问题讨论】:
-
你不能。 servlet 侦听器通过一个完全独立于 Jersey 的系统。也许考虑使用 Jersey 的 ApplicationEventListener 而不是 servlet 监听器
-
@peeskillet,它有效。需要跳过
INITIALIZATION_START类型的第一个ApplicationEvent,然后注入依赖项。但是,您引用的文档指出:Jersey monitoring support has been released as a beta release in Jersey 2.1 version. As such, the exposed monitoring public APIs and functionality described in this section may change in the future Jersey releases.。你知道这个 API 现在有多稳定吗? -
Dropwizard 一直在使用它来处理 Hibernate 会话管理。我可能会说它足够稳定。
-
@peeskillet,太好了。您想将此作为答案发布吗?
-
我认为 HK2 不太可能,你可以用 Guice 做到这一点
标签: dependency-injection jersey-2.0 hk2 servletcontextlistener