由于Guice注释,我有一个单独的Controller
类。当我用另一个单例类扩展这个类时,我得到一个新的List,而因为注释只应该有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);
只要我将一个对象添加到列表appGegevensServices
或talenServices
并在另一个类(或该列表中的一个特定实例)中请求列表,它就为空。我怎样才能确保只有一个列表?
答案 0 :(得分:1)
我得到一个新的List,而因为注释只应该有1
你误解了@Singleton
的作用:它只是告诉guice只在绑定时创建该特定类的一个实例。
如果您手动创建了Controller
的实例和MaakNieuweAppController
&#34;的实例,那么您希望他们不会希望他们共享列表实例 - 而且&#当Guice创造它们时,没有什么不同。 Guice只是一遍又一遍地重复使用Controller
的同一个实例,并且反复使用MaakNieuweAppController
的同一个实例。
(请注意,如果您有Controller
的实例和MaakNieuweAppController
中的一个,Controller
无论如何都不是单身,因为它有两个实例。)
如果您希望它们共享列表,则需要注入列表实例,并确保它绑定到单例实例。
public class Controller extends HttpServlet {
@Inject
protected List<IAppGegevensService> appGegevensServices;
}
然后
@Provides @Singleton
List<IAppGegevensService> provideList() { ... }
(或者你想提供它)