jax-rs(rest api)和websockets的组合 - 在哪里放置常见的初始化

时间:2015-10-13 18:11:24

标签: java tomcat websocket initialization jax-rs

我正在开发一个涉及JAX-RS(用于REST API)和Websocket(用于通知)的项目。该项目将作为WAR部署到应用程序服务器中。

对于JAX-RS,我执行以下操作:

@ApplicationPath("/")
public class MyApplicationREST extends ResourceConfig {
    public MyApplicationREST() {
        ... initialization here ...
    }
}

对于Websockets,我执行以下操作:

public class MyApplicationWebsockets implements ServerApplicationConfig {
    ... callbacks for discovery of endpoints here ...
}

部署WAR时,应用程序服务器(在我的情况下为Tomcat)可以完美地拾取这两个类,并在真空中正常工作。

但是,在这两个类中,我需要一个命令实例的引用(在这种情况下是数据库连接,但它可以是任何东西)。我无法在上面的两个类之一中实例化它(并在另一个类中使用它),因为不能保证两个类的初始化顺序。

这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

初始化

(1)创建一个实现ServletContextListener的类。

(2)用contextInitialized(ServletContextEvent)方法编写初始化代码。

public class MyContextListener implements ServletContextListener
{
    @Override
    public void contextInitialized(ServletContextEvent context)
    {
        // Your initialization code here.
    }


    @Override
    public void contextDestroyed(ServletContextEvent context)
    {
        // Your finalization code here.
    }
}

(3)在web.xml注册班级作为听众。

<listener>
    <listener-class>com.example.MyContextListener</listener-class>
</listener>


共享实例

关于共享实例,单例模式是实现它的可能方法之一。

public class DB
{
    private static final DB sInstance = new DB();

    // Private constructor to prevent DB instances from being created by others.
    private DB()
    {
    }

    // Get the singleton instance.
    public static DB getInstance()
    {
        return sInstance;
    }
}