Spring IoC контейнер: DI на основе конструктора или сеттера?

Поскольку вы можете смешивать DI на основе конструктора и сеттера, рекомендуется использовать конструкторы для обязательных зависимостей, а также методы сеттеры или методы настройки для необязательных зависимостей. Обратите внимание, что использование аннотации @Required в методе сеттере может быть использовано для того, чтобы сделать свойство обязательной зависимостью; однако внедрение в конструктор с программной проверкой аргументов предпочтительнее.

Команда Spring, как правило, выступает за внедрение конструктора, поскольку она позволяет реализовывать компоненты приложения как неизменяемые объекты и гарантирует, что требуемые зависимости не равны null. Более того, внедренные конструктором компоненты всегда возвращаются клиентскому (вызывающему) коду в полностью инициализированном состоянии. В качестве примечания следует отметить, что большое количество аргументов конструктора является нежелательным кодом, подразумевая, что класс, вероятно, имеет слишком много обязанностей и должен быть реорганизован для лучшего решения правильного разделения проблем.

Внедрение сеттера должно в первую очередь использоваться только для необязательных зависимостей, которым могут быть назначены разумные значения по умолчанию в классе. В противном случае проверки не-null должны выполняться везде, где код использует зависимость. Одним из преимуществ внедрения сеттера является то, что методы сеттеры делают объекты этого класса пригодными для реконфигурации или повторного внедрения позже. Поэтому управление с помощью JMX MBeans является убедительным примером использования для инъекции сеттера.

Используйте стиль DI, наиболее подходящий для определенного класса. Иногда, когда вы имеете дело со сторонними классами, для которых у вас нет исходного кода, выбор делается за вас. Например, если сторонний класс не предоставляет каких-либо методов-сеттеров, то внедрение конструктора может быть единственной доступной формой DI.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки