Метод установки guice AbstractModule

Что делает метод install() из класса AbstractModule? Может кто-нибудь объяснить это мне? Из документов, которые я прочитал с сайта guice, все, что я мог получить, было:

Использует данный модуль для настройки большего количества привязок.

Настроить какие привязки точно? Связывание с установленным модулем или привязки класса, вызвавшего метод установки?

Ответ 1

install разрешает композицию: в рамках своего метода configure FooModule может установить FooServiceModule (например). Это означало бы, что инжектор, созданный только на FooModule, будет включать привязки и провайдеры как в FooModule, так и в FooServiceModule.

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

Состав модуля может быть обоюдоострым мечом, поскольку дублирующиеся привязки не допускаются: если ваш FooModule и BarModule оба install одинаковый зависимый модуль, а привязки не точные дубликаты (например, если модуль создает экземпляр объекта по методу configure), Guice не сможет создать любой инжектор, который устанавливает как FooModule, так и BarModule из-за дублирования привязки. Вы можете обойти это, указав equals и hashCode на своих модулях, или управляя своей композицией, чтобы любой модуль был либо на верхнем уровне, либо установлен точно в одном другом модуле (но никогда не оба).

См. этот архивный блог или this SO answer для получения дополнительной информации о дублировании привязок.