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

时间:2017-01-05 14:08:01

标签: java servlets singleton guice

由于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);

只要我将一个对象添加到列表appGegevensServicestalenServices并在另一个类(或该列表中的一个特定实例)中请求列表,它就为空。我怎样才能确保只有一个列表?

1 个答案:

答案 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() { ... }

(或者你想提供它)