gpt4 book ai didi

java - (Guice) 扩展单例类创建单独的列表

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

我有一个类Controller,由于 Guice 注释,它是单例的。当我用另一个单例类扩展这个类时,我得到一个新的列表,而由于注释的原因,应该只有 1 个列表。这是 Controller 的代码:

@Singleton
public class Controller extends HttpServlet {

@Inject protected IAccountService accountService;
@Inject protected ITalenService talenService;
@Inject protected List<IAppGegevensService> appGegevensServices;
@Inject protected List<ITalenService> talenServices;

我知道我有两个 ITalenServices,但那是因为另一个原因。我的模块包含这段代码:

@Singleton @Provides
List<IAppGegevensService> provideAppGegevensServices() {
return new ArrayList<>();
}

@Singleton @Provides
List<ITalenService> provideTalenServices() {
return new ArrayList<>();
}

以下是扩展 Controller 并设置列表的类的代码:

@Singleton
public class MaakNieuweAppController extends Controller {

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setAttribute("talen", talenService.getAlleTalen());
addAppGegevensService(accountService.findAccount((String) req.getSession().getAttribute("email")));
addTalenService(accountService.findAccount((String) req.getSession().getAttribute("email")));
req.getRequestDispatcher("kiezenTalen.jsp").forward(req, resp);
}

}

这是一个类的代码,它要求列表中的值之一:

@Singleton
@MultipartConfig
public class AlgemeneGegevensController extends Controller {

private Account account;
private IAppGegevensService appGegevensService;

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
account = accountService.findAccount((String) req.getSession().getAttribute("email"));
appGegevensService = getAppGegevensService(account);

一旦我将一个对象添加到列表 appGegevensServicestalenServices 并请求另一个类中的列表(或该列表中的一个特定实例),它就是 null 。如何确保只有 1 个列表?

最佳答案

I get a new List while there should only be 1 because of the annotation

您误解了 @Singleton 的作用:它只是告诉 guice 在绑定(bind)时仅创建该特定类的一个实例。

如果您“手动”创建了 Controller 的实例和 MaakNieuweAppController 的实例,您可能不会期望它们共享列表实例 - 而且事实并非如此Guice 创建它们时有所不同。 Guice 只是一遍又一遍地重复使用 Controller 的相同实例,以及一遍又一遍地重复使用 MaakNieuweAppController 的相同实例。

(请注意,如果您有一个 Controller 实例和 MaakNieuweAppController 之一,Controller 无论如何都不是单例,因为有两个实例。)

如果您希望它们共享一个列表,您需要注入(inject)列表实例,并确保它绑定(bind)到单例实例。

public class Controller extends HttpServlet {
@Inject
protected List<IAppGegevensService> appGegevensServices;

}

然后

@Provides @Singleton
List<IAppGegevensService> provideList() { ... }

(或者您想要提供的方式)

关于java - (Guice) 扩展单例类创建单独的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41487140/

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