Внедрение в бизнес-уровень Java Web App - PullRequest
4 голосов
/ 18 сентября 2011

Я успешно использовал Guice для внедрения провайдеров в часть сервлета существующего веб-приложения Java, однако я не могу получить доступ к инжекторам через бизнес-уровень (классы Java не сервлета) приложения.

Я прочитал статью «Инъекция инжектора», но для меня это больше похоже на взлом, и в некоторых местах, включая документацию Guice, говорится, что не нужно делать это слишком много.

Я предполагаю, что мой вопрос: где я запускаю веб-приложение java, чтобы классы, не являющиеся сервлетами / фильтрами, имели доступ к инжектору, созданному в классе, который я использую для расширения GuiceServletContextListener? Есть ли способ сделать эти классы инъекционными без инъекций?

Спасибо и дайте мне знать, если вам нужны какие-либо разъяснения.

Edit:

Я пытаюсь сделать это с помощью простого регистратора, в моем сервлетами, я звоню:

@Inject
   private static org.slf4j.Logger log;

Впрыск настраивается в MyLoggerModule следующим образом (который находится в вызов createInjector с ServletModule):

@Override
   public void configure() {
       bindListener(Matchers.any(), new SLF4JTypeListener()); // I
       built my own SLF4JTypeListener...
   }

Это все отлично работает в сервлетах, но инъекция поля делает не работает при вызове классом, который не является сервлетом или фильтром.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Guice не перехватывает вызовы для новых объектов, поэтому, если ваш бизнес-уровень еще не использует Guice для создания объектов, требующих внедрения, для этого потребуется модификация.

Впрыск работает только при обработке Guice во время впрыска . Итак, начиная с базового инжектора, который вы сделали, все, что помечено @Inject, которое необходимо для запрашиваемого вами экземпляра, будет предоставлено Guice как можно лучше, и, в свою очередь, во время его создания, далее @Inject аннотации будут заполняться поставщиками и привязками до тех пор, пока ничего нового не понадобится. Однако с этого момента вы не собираетесь вставлять поля в сервлеты, созданные вне внедрения Guice, возможно, вызывая где-то new, что, вероятно, делает ваша фабрика объектов.

Вам нужно будет изменить свою фабрику объектов, чтобы использовать поставщиков вместо новых. Если бы вы могли их отредактировать, это было бы не слишком сложно, поскольку Guice может предоставить вам провайдеров по умолчанию для привязок.

Таким образом, один из способов, которым ваш бизнес-уровень может быть осведомлен Guice, - это сначала создать Injector, а затем запросить сервлеты, созданные инжектором. Если это означает, что у вас будет более одного инжектора, тогда да, это будет проблемой, но только для объектов, которые вы хотите быть одиночками. Таким образом, вы можете создать класс фабричного шаблона для одноэлементного инжектора, или вы можете найти, где создаются эти классы (здесь напечатанная строка), которые сами создают сервлеты (в foo), а затем начать с инжектора там (в foo), используя один Придумайте инжектор, чтобы создать эти классы (тип bar), а также измените их (тип bar), чтобы запросить поставщика для сервлетов, которые они будут использовать вместо вызова нового сервлета.

Теперь, когда я думаю об этом, это может быть просто, если это происходит только один или два раза для 10-20 типов сервлетов, или это может быть сложно, если есть какая-то структура, которая определяет абсолютно гибкое поведение для того, что обновляется, когда и почему.

Другим вариантом будет всегда избегать @Inject для полей, как рекомендуется. Так что теперь ваши сервлеты принимают org.slf4j.Logger в качестве параметра конструкции. Конструктор помечен @Inject, и он присваивает значение параметра полю. Тогда любое место, где вы не используете инъекцию, должно сломаться с неверным количеством параметров при новом вызове. Исправьте это, выяснив, как вместо этого получить представленный здесь сервлет или как получить провайдера для сервлета в классе.

0 голосов
/ 18 сентября 2011

Не уверен, что вы имеете в виду ... если вы внедряете объекты в свои сервлеты / фильтры, эти объекты также имеют свои зависимости, внедряемые Guice, и так далее.

Как высоздание классов, в которые вы пытаетесь внедрить этот регистратор?Они должны быть созданы Guice для инъекции, что означает отсутствие new.

...