我的类的对象是每次有请求时创建的,还是只为每个实例服务器创建一个类的实例

时间:2013-07-18 17:02:40

标签: java google-app-engine jersey jax-rs

我问的原因是因为我想知道我是否应该将一个对象声明为一个字段并在构造函数中初始化它,即使它只被一个方法使用,或者我只应该在方法内部初始化它称为

:此

 @Path("/user/")
    public class MyUserResource(){
    UserManager userManager;
    PathManager pathManager;

    MyUserResource(){
        userManager = new userManager();//used by many methods in this class
        pathManager = new PathManager(); // used by only one method in this class
    }
    @GET
    @Path("/getPath")
    public getPath(long id){ // That one method using pathManager
        pathManager.doWork(id)
   }
}

VS

public class MyUserResource(){
    UserManager userManager;

    MyUserResource(){
        userManager = new userManager();//used by many methods in this class
        PathManager pathManager = new PathManager(); // used by only one method in this class

    @GET
    @Path("/getPath")
    public getPath(long id){ // That one method using pathManager
        PathManager pathManager = new PathManager(); 
        pathManager.doWork(id)
   }
}

必须创建对象并且需要JVM的工作。在第二个示例中,对象仅在需要该方法时创建,但是向下是它可以每分钟创建100次,因为它被大量调用。它也可能根本不需要,但是类实例化了100次,因为类中的其他方法被调用,就像在第一个例子中一样。但是如果GAE只在实例上创建,那么在构造函数中实例化PathManager会是一个更好的选择,但我找不到任何证明这个的文档

1 个答案:

答案 0 :(得分:0)

默认情况下,“按请求”创建资源类实例。您可以将它们标记为单例,然后将一个实例用于所有请求。为此,您可以使用以下注释:

    泽西1.x(JAX-RS 1.1)的
  • @com.sun.jersey.spi.resource.Singleton
  • 泽西2.x(JAX-RS 2.0)的
  • @javax.inject.Singleton