Долгое время я считал, что имеет смысл иметь «централизованную, декларативную конфигурацию», такую как XML-файлы, которые мы все использовали. Затем я понял, что большинство файлов в файлах не было конфигурацией - оно никогда не менялось нигде после разработки, никогда. Затем я понял, что «централизованный» имеет значение только в довольно небольших системах - только в небольших системах вы когда-нибудь сможете получить файл конфигурации в целом . И какова на самом деле ценность понимания разводки в целом, когда одни и те же «разводки» в основном дублируются зависимостями в коде? Поэтому единственное, что я сохранил, - это метаданные (аннотации), которые все еще являются декларативными. Эти никогда не изменяются во время выполнения, и они никогда"данные конфигурации", которые кто-то изменит на лету - поэтому я думаю, что хранить их в коде - это хорошо.
Я использую полное автоматическое подключение столько, сколько могу. Я люблю это. Я не вернусь к весне старого образца, если не буду угрожать оружием. Мои причины для полного предпочтения @Autowired
со временем изменились.
Сейчас я думаю, что наиболее важной причиной использования автопроводки является то, что в вашей системе есть одна абстракция, которую нужно отслеживать. «Имя боба» фактически исчезло. Оказывается, имя компонента существует только из-за xml. Таким образом, полный слой абстрактных косвенных указаний (где вы бы связали имя bean-компонента "foo" с "bar" bean-компонента) пропал. Теперь я подключаю интерфейс «Foo» непосредственно к своему компоненту, и реализация выбирается профилем времени выполнения. Это позволяет мне работать с кодом при отслеживании зависимостей и реализаций. Когда я вижу в своем коде автосвязанную зависимость, я могу просто нажать кнопку «перейти к реализации» в моей среде IDE, и появляется список известных реализаций. В большинстве случаев есть только одна реализация, и я прямо в классе. Не может быть намного проще, чем я, и я всегда знаю точно какая реализация используется (я утверждаю, что обратная сторона ближе к истине с проводкой xml - забавно, как меняется ваша перспектива!)
Теперь вы можете сказать, что это просто очень простой слой, но каждый уровень абстракции, который мы добавляем к нашим системам , увеличивает сложность. Я действительно не думаю, что XML когда-либо добавлял реальную ценность к любой системе, с которой я работал.
Большинство систем, с которыми я когда-либо работал, имеют только одну конфигурацию рабочей среды выполнения. Там могут быть другие конфигурации для тестирования и т. Д.
Я бы сказал, что полная автоматическая разводка - это пружина на рельсах: она охватывает представление о том, что существует нормальная и распространенная схема использования, которой придерживается большинство вариантов использования. С конфигурацией XML вы разрешаете много последовательного / противоречивого использования конфигурации, которое может / не может быть предназначено. Я видел, как много xml-конфигураций выходят за рамки несогласованностей - реорганизуются ли они вместе с кодом? Мысль нет. Есть ли эти вариации по какой-то причине? Обычно нет.
Мы почти не используем квалификаторы в нашей конфигурации и нашли другие способы решения этих ситуаций. Это явный «недостаток», с которым мы сталкиваемся: мы немного изменили способ кодирования, чтобы он стал более плавным при взаимодействии с автопроводкой: хранилище клиентов больше не реализует общий интерфейс Repository<Customer>
, но мы создаем интерфейс CustomerRepository
, расширяющий Repository<Customer>
. Иногда также есть хитрость или два, когда дело доходит до подклассов. Но это, как правило, просто указывает нам направление более строгого набора текста, что, как я считаю, почти всегда является лучшим решением.
Но да, вы привязаны к определенному стилю DI, который в основном делает весна. Мы даже больше не публикуем сеттеры для зависимостей (так что вы можете утверждать, что мы +1 в отделе инкапсуляции / сокрытия информации) У нас все еще есть некоторый xml в нашей системе, но xml в основном only содержит аномалии. Полное автоматическое подключение прекрасно сочетается с XML.
Теперь нам нужно только, чтобы @Component
, @Autowired
и остальные были включены в JSR (например, JSR-250 ), поэтому нам не нужно связывать с весны. Так происходило в прошлом (на ум приходит java.util.concurrent
), так что я не был бы полностью удивлен, если это повторилось.