我使用Jersey将一些统计数据公开为REST服务。 我正在使用Weblogic
但每次执行请求获取统计信息时 System.out.println(“在PostConstruct中”);被称为。
即使我在@Stateless路径旁边注释,也会发生这种情况。
这就像在每个请求(req范围)
上实例化StorageService一样有没有办法让初始化只调用一次并避免在每个请求上创建StorageService?
@Path("/statistics")
public class StorageService {
@Context
private ServletContext application;
StatisticsStorage statisticsStorage;
@PostConstruct
public void initialize() {
System.out.println("In PostConstruct");
try {
statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString()));
} catch (Exception sqle) {
sqle.printStackTrace();
}
}
@GET
// The Java method will produce content identified by the MIME Media type "text/plain"
@Produces({MediaType.APPLICATION_JSON})
public Domain getSnapshot() {}
由于
答案 0 :(得分:2)
Jersey在每个请求上实例化该类。请注意,您可以使用@Context注释的大多数内容都是特定于请求的。您最好的办法是将StatisticsStorage字段设置为静态,并在第一次请求时初始化它(需要同步)。也许是这样的:
public StorageService(@Context ServletContext application) {
super(servletConfig, request, httpServletRequest, uriInfo, httpHeaders, securityContext);
synchronized (this.getClass()) {
if (statisticsStorage == null) {
try {
statisticsStorage = new StatisticsStorage((String) application.getAttribute(AppProperties.PropKey.STATS_OUTPUT_PATH_PROP.toString()));
} catch (Exception sqle) {
sqle.printStackTrace();
}
}
}
}
static StatisticsStorage statisticsStorage;
答案 1 :(得分:1)
默认"范围" JAX-RS资源类是按请求范围。我们也可以将该类注册为单例。不同的JAX-RS实现可能有不同的方式来实现。例如,Apache Wink有一个@Scope(ScopeType.SINGLETON)
。但唯一可移植的方法是使用javax.ws.rs.core.Application
子类。类似的东西:
@ApplicationPath("/api")
public class MyApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
}
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<>();
singletons.add(new StorageService());
return singletons;
}
}
getClasses()
中返回的所有内容都是每个请求资源。并且getSingletons()
将返回&#34;应用程序范围&#34;的资源。 Jersey永远不会尝试实例化类,所以我们可以自己处理所有的初始化。
另一方面,你可能要考虑,如果让这个班级成为你想要的单身人士。通过这样做,它将导致资源类是有状态的,您将需要处理任何并发问题。
如果您想在@PostConstruct
中创建StatisticsStorage
,那么可能更好的选择是使用注入框架,例如Guice。这是good Guice example(s)。或EE的CDI