У меня есть класс Controller
, который является одноэлементным из-за аннотации Guice. Когда я расширяю этот класс другим классом singleton, я получаю новый List, в то время как из аннотации должно быть только 1. Вот код Controller
:(Guice) Расширение singleton class делает отдельные списки
@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
и попросить список I n другой класс (или один конкретный экземпляр в этом списке) он равен нулю. Как я могу убедиться, что есть только 1 список?
«Я получаю новый список, а там должен быть только 1 из аннотации» Вы поняли, что '@ Singleton' делает: он просто подсказывает только, чтобы создать один экземпляр этого конкретного класса при привязке. Если у вас есть экземпляр 'Controller' и один из' MaakNieuweAppController', 'Controller' не является одиночным, потому что есть два его экземпляра. –
Я понимаю, что он подсказывает, как создать один экземпляр класса, но тогда должен быть только один список слишком прав? И почему контроллер не является одиночным? Это должно быть из-за аннотации, или я ошибаюсь? ^^ – Sjoerd
Word of advise: Если вы используете инъекцию поля (добавьте аннотацию к атрибутам), будьте очень осторожны, что вы делаете внутри своего конструктора. У вас нет доступа к инъецированным бобам здесь! В вашем примере вы не обращаетесь к ним, но если вам нужно инициализировать материал в конструкторе, лучше всего использовать инъекцию конструктора. –