在Jersey中使用HK2将依赖项注入ServletContextListener

时间:2017-06-22 05:34:21

标签: dependency-injection jersey-2.0 hk2 servletcontextlistener

为了在启动时初始化应用程序,我扩展了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
    }
}

我尝试通过简单地添加StartupManager注释将ServletContextListener注入@Inject

@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 )时引用为null。

然后我想我可能需要注册一个活页夹:

@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?优选构造剂注入,但现场注入也可以。

1 个答案:

答案 0 :(得分:3)

它不起作用,因为servlet监听器和Jersey没有链接到同一个系统。作为替代方案,您可以使用泽西岛的Event Listeners。您可以实现cell.contentView.backgroundColor = UIColor(red: 237/255.0, green: 237/255.0, blue: 237/255.0, alpha: 1),您可以在其中初始化和清理,就像在servlet侦听器中一样。您可以将您的服务注入泽西的听众。