Не могу понять поле инъекции - PullRequest
4 голосов
/ 07 января 2012

Я пытаюсь понять внедрение зависимости.

Я читаю много статей, но чем больше я читаю, тем больше я запутываюсь.

Итак, то, что я сделал, пытаетсячтобы понять некоторые исходные коды, размещенные на странице Google Guice .

Я понял, что мы должны создать модуль (например: BillingModule), в котором выполняется связь между интерфейсом и его реализацией:

bind(BillingService.class).to(RealBillingService.class);

И в классе реализации мы должны inject конструктор.

Проблема в том, что я не могу понять внедрение поля :

@Inject Connection connection;

Вопрос прост: что это значит?

Ответы [ 2 ]

4 голосов
/ 07 января 2012

Это означает, что вы не создаете экземпляр своего объекта, как обычно:

Connection connection = //someConstructor 

но вы скорее ожидаете получить это другими способами. @Inject аннотация определяет точку внедрения, и именно там вы хотите, чтобы сервер приложений создавал для вас объект подключения, в зависимости от конфигурации. По сути это означает, что вы избавлены от сложностей создания экземпляра объекта Connection и можете работать только с функциональностью.

Конечно, если ваш сервер приложений не поддерживает внедрение полей или по какой-то причине это не удалось, аннотация @Inject ничего не будет значить, и вы получите нулевой объект соединения.

1 голос
/ 07 января 2012

Аннотирует членов вашего класса реализации (конструкторы, методы и поля), в которые Injector должен вводить значения.Инжектор выполняет запросы на инжекцию для:

  • Каждый экземпляр, который он создает.У конструируемого класса должен быть ровно один из его конструкторов, помеченных @Inject, или у конструктора не должно быть параметров.Затем Инжектор переходит к выполнению инъекций метода и поля.

  • Предварительно созданные экземпляры, переданные в injectMembers(Object), toInstance(Object) и toProvider(Provider).В этом случае все конструкторы, конечно же, игнорируются.

  • Статические поля и методы классов, для которых любой Модуль специально запросил статическое внедрение, используя requestStaticInjection(Class...).

Во всех случаях член может быть введен независимо от его спецификатора доступа Java (частный, по умолчанию, защищенный, общедоступный).

...