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