Инъекция зависимостей через сеттеры предоставляет гибкость в Spring, но имеет несколько серьёзных недостатков по сравнению с инъекцией через конструктор.
При инъекции через сеттеры нет гарантии, что все необходимые зависимости на самом деле будут внедрены. Это может привести к:
NullPointerException во время выполнения при обращении к неинициализированным полямВ отличие от этого, инъекция через конструктор гарантирует, что объект не может быть создан, пока все зависимости не предоставлены заранее.
Инъекция через сеттеры позволяет переопределять зависимости после создания объекта. Это создаёт серьёзные риски безопасности, потому что:
Инъекция через конструктор предотвращает это, делая зависимости неизменяемыми после инициализации.
Инъекция через сеттеры может создавать циклические зависимости между объектами без надлежащего обнаружения:
Инъекция через конструктор сразу же обнаруживает эту проблему на этапе создания бина и выбрасывает ObjectCurrentlyInCreationException, падая раньше, чем позволить проблемным конфигурациям пройти дальше.
По этим причинам инъекция зависимостей через конструктор обычно считается лучшим подходом в приложениях Spring. Она обеспечивает:
Используй инъекцию через сеттеры только для опциональных зависимостей или особых случаев, когда инъекция через конструктор непрактична.
Constructor-based DI предотвращает циклические зависимости, обнаруживая их во время создания bean'а и выбрасывая ObjectCurrentlyInCreationException, в то время как Setter-based DI может позволить циклическим зависимостям частично инициализироваться без немедленного обнаружения.
Новый — ещё не проверен сообществом
Вы