我们正在使用ReastEasy和JBoss EAP 6.x.我想知道是否总是为每个http请求创建一个新对象。如果是,我怎样才能阻止JBoss为每个请求创建新对象?
我使用javax.annotation.@PostConstruct
在我的Web服务类中注释了一个void方法,以检查是否始终创建了一个新对象。为了我的娱乐,这个方法本身并未被调用。然后我明白servlet容器正在管理我的Web服务类,这就是为什么不调用@PostConstruct
的原因。我是对的吗?
有谁能请我指出一些解释网络服务生命周期的资源?
答案 0 :(得分:1)
“我想知道是否总是为每个http请求创建一个新对象”
是。请参阅JAX-RS规范中的3.1.1 Lifecycle and Environment部分:
默认情况下,会为每个对该资源的请求创建一个新的资源类实例。
“如果是,我怎样才能阻止jboss为每个请求创建新对象?”
一种方法是覆盖getSingletons()
子类中的Application
,它返回一个Set
资源和提供程序,您只想创建一次。有关部署选项的更多信息,请参阅Resteasy Doc。例如
@ApplicationPath("/rest")
public class RestApplication extends Application {
private final Set<Object> singletons = new HashSet<Object>();
public RestApplication(){
singletons.add(new SingletnResourceClass());
}
@Override
public Set<Object> getSingletons(){
return singletons;
}
}
“然后我明白servlet容器正在管理我的Web服务类,这就是没有调用@PostConstruct的原因。我是对的吗?”
Java EE中的注释由CDI处理,在JBoss中,我们应该在beans.xml
中有一个WEB-INF
文件来启用CDI模块。
“任何人都可以请一些解释网络服务生命周期的资源吗?”
上面的第一个链接有一些解释
答案 1 :(得分:1)
我想指出的一件事是:您可以将资源注释为@Singleton
(javax.inject.Singleton),只创建一次。
这也提到in the documentation:
@Singleton:在这个范围内,每个jax-rs应用程序只有一个实例。 Singleton资源可以使用@Singleton及其注释 class可以使用Application实例注册。您可以 通过将单例实例注册到单元中来创建单例 应用