Guice не перехватывает вызовы для новых объектов, поэтому, если ваш бизнес-уровень еще не использует Guice для создания объектов, требующих внедрения, для этого потребуется модификация.
Впрыск работает только при обработке Guice во время впрыска . Итак, начиная с базового инжектора, который вы сделали, все, что помечено @Inject
, которое необходимо для запрашиваемого вами экземпляра, будет предоставлено Guice как можно лучше, и, в свою очередь, во время его создания, далее @Inject
аннотации будут заполняться поставщиками и привязками до тех пор, пока ничего нового не понадобится. Однако с этого момента вы не собираетесь вставлять поля в сервлеты, созданные вне внедрения Guice, возможно, вызывая где-то new
, что, вероятно, делает ваша фабрика объектов.
Вам нужно будет изменить свою фабрику объектов, чтобы использовать поставщиков вместо новых. Если бы вы могли их отредактировать, это было бы не слишком сложно, поскольку Guice может предоставить вам провайдеров по умолчанию для привязок.
Таким образом, один из способов, которым ваш бизнес-уровень может быть осведомлен Guice, - это сначала создать Injector, а затем запросить сервлеты, созданные инжектором. Если это означает, что у вас будет более одного инжектора, тогда да, это будет проблемой, но только для объектов, которые вы хотите быть одиночками. Таким образом, вы можете создать класс фабричного шаблона для одноэлементного инжектора, или вы можете найти, где создаются эти классы (здесь напечатанная строка), которые сами создают сервлеты (в foo), а затем начать с инжектора там (в foo), используя один Придумайте инжектор, чтобы создать эти классы (тип bar), а также измените их (тип bar), чтобы запросить поставщика для сервлетов, которые они будут использовать вместо вызова нового сервлета.
Теперь, когда я думаю об этом, это может быть просто, если это происходит только один или два раза для 10-20 типов сервлетов, или это может быть сложно, если есть какая-то структура, которая определяет абсолютно гибкое поведение для того, что обновляется, когда и почему.
Другим вариантом будет всегда избегать @Inject для полей, как рекомендуется. Так что теперь ваши сервлеты принимают org.slf4j.Logger
в качестве параметра конструкции. Конструктор помечен @Inject
, и он присваивает значение параметра полю. Тогда любое место, где вы не используете инъекцию, должно сломаться с неверным количеством параметров при новом вызове. Исправьте это, выяснив, как вместо этого получить представленный здесь сервлет или как получить провайдера для сервлета в классе.