我正在开发一个涉及 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) 创建一个实现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;
}
}
关于java - jax-rs(rest api)和 websockets 的组合 - 在哪里放置公共(public)初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33109707/