在 Jersey 中使用 HK2 将依赖项注入 ServletContextListener
Inject dependencies into ServletContextListener using HK2 in Jersey
为了在启动时初始化应用程序,我扩展了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
class 中,并从 MyServletContextListener
:
委托给这个 class
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 的 Event Listeners。您可以实现一个 ApplicationEventListener
,您可以在其中以与在 servlet 侦听器中相同的方式进行初始化和清理。您将能够将您的服务注入 Jersey 的侦听器。
为了在启动时初始化应用程序,我扩展了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
class 中,并从 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 的 Event Listeners。您可以实现一个 ApplicationEventListener
,您可以在其中以与在 servlet 侦听器中相同的方式进行初始化和清理。您将能够将您的服务注入 Jersey 的侦听器。