Jersey Singleton多次实例化

时间:2016-12-28 17:16:40

标签: java jersey-2.0 tomcat8

我必须制作一个非常小的REST应用程序,即使我已经习惯了Spring,Jersey似乎比Spring更轻(也许我错了?)。

我在Tomcat 8.0.39上使用Jersey 2.25。

我有一个当前访问文本文件的DAO类(将升级到jdbc连接)。那些读/写操作必须同步,因此我希望我的DAO实例是单例。

@Singleton
public class ModelDao extends IModelDao
    public ModelDao() {
        System.out.println("init ModelDao");
    }

    @Override
    public MyModel read(int id){...}
}

这个单身人士注入了一项服务:

@Path("/Model/")
public class ModelService {

    @Inject
    private IModelDao modelDao;

    @Path("{id}")
    @GET
    @Produces("application/json")
    public MyModel getModel(@PathParam("id") Integer id) {
        return modelDao.read(id);
    }
}

通过活页夹

public class DaoBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(ModelDao.class).to(IModelDao.class);
    }
}

ResourceConfig中,我注册了活页夹和我的包。 当我使用我的服务时,我得到了正确的数据,但每个请求都会调用ModelDao构造函数。因此读/写操作不同步。

我理解一个带注释的类@Singleton应该只在我的应用中实例化一次。 我弄错了吗?

2 个答案:

答案 0 :(得分:2)

通过AbstractBinder将服务绑定到Jersey,不支持@Singleton注释。您需要使用bind().to().in(Scope)语法,其中Scope将是例如Singleton.classRequestScoped.classPerLookup。默认范围是bind(Class).to(Class),这会导致您当前遇到的行为。

而不是bind(Instance).to(Class),您可以使用class Some { var p :OtherClass? func someMethod() { p = p ?? OtherClass() ... } } ,这会自动使其成为单身,而无需指定范围。

答案 1 :(得分:-1)

将类设置为Singleton后,是否在应用程序中注册了它?

这样的事情:

public class App extends ResourceConfig {
    public App () {
        register(ModelDao.class);
    }
}