是否为RestEasy Web服务类创建了一个新对象?

时间:2015-02-23 14:38:30

标签: rest java-ee jax-rs resteasy jboss6.x

我们正在使用ReastEasy和JBoss EAP 6.x.我想知道是否总是为每个http请求创建一个新对象。如果是,我怎样才能阻止JBoss为每个请求创建新对象?

我使用javax.annotation.@PostConstruct在我的Web服务类中注释了一个void方法,以检查是否始终创建了一个新对象。为了我的娱乐,这个方法本身并未被调用。然后我明白servlet容器正在管理我的Web服务类,这就是为什么不调用@PostConstruct的原因。我是对的吗?

有谁能请我指出一些解释网络服务生命周期的资源?

2 个答案:

答案 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实例注册。您可以   通过将单例实例注册到单元中来创建单例   应用