我正在使用Play Framework编写RESTful API,并且我在应用程序启动时有一些引导操作;
Client transClient = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(ESHost, 9300));
这是非常基本的,我建立了与ElasticSearch
群集的连接。现在,我希望transClient
可以packages/controllers/etc
访问Cache.set("ES", transClient)
,一种解决方法可能是{{1}},这似乎是正确的。
我在网上找不到任何关于此的文档。最好的方法是什么?
答案 0 :(得分:1)
最简单的方法是单身人士。您甚至不必在全局 onStart 方法中引导它。
public class ConnectionHolder {
private static ConnectionHolder holder;
private Client transClient = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress(ESHost, 9300));
private ConnectionHolder() { }
static ConnectionHolder getInstance() {
return holder == null ? holder = new ConnectionHolder() : holder;
}
public Client getClient() {
return transClient;
}
}
<强> TL;博士强>
在我目前的项目中,我们使用Guice单例范围来解决这类问题。因此我们可以轻松地向控制器或服务注入任何东西这种解决方案有很多优点,特别是在测试期间。如果您的项目中没有任何依赖注入框架,那么简单的单例就可以完成这项工作。解决线程安全问题取决于您。