gpt4 book ai didi

java - Jersey Singleton实例化多次

转载 作者:行者123 更新时间:2023-11-30 06:58:30 37 4
gpt4 key购买 nike

我必须制作一个非常小的 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){...}
}

这个单例被注入(inject)到服务中:

@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);
}
}

通过 Binder

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

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

我理解一个带注释的类 @Singleton 应该在我的应用程序中仅实例化一次。难道是我理解错了?

最佳答案

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

此外,您还可以使用 bind(Instance).to(Class),而不是 bind(Class).to(Class),这会自动使其成为单例,不需要 g 指定范围。

关于java - Jersey Singleton实例化多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366775/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com