Жизненный цикл вашего приложения полностью контролируется контейнером сервлета, поэтому использование прослушивателя контекста для запуска процесса инициализации вашего приложения является логическим результатом этого факта. Таким образом, я бы не сказал, что этот факт сам по себе не нарушает многоуровневую архитектуру, точно так же, как веб-запрос, запускающий активность на уровне модели, не нарушает многоуровневую архитектуру.
Но чтобы не нарушать многоуровневую архитектуру, прослушиватель контекста сервлета не должен связываться с деталями других уровней, он должен только инициировать инициализацию. Таким образом, весь код, связанный с Guice, например фабрика инжекторов Guice, должен располагаться в своем собственном слое. Роль прослушивателя контекста должна быть ограничена вызовом, который запускает инициализацию (например: MyGuiceFactory.init () или MyApp.init ()).