Я сомневаюсь, что это можно считать объективным вопросом, но давайте попробуем.
У меня было довольно много дискуссий по этому поводу, и, конечно, не только вы так думаете.
Да, такое поведение делает IoC несколько бессмысленным. Это по-прежнему упрощает задачу, поскольку вам не нужно самим определять идеальный порядок подключения, но вы теряете преимущество возможности переключения реализаций путем изменения файла конфигурации, что является одной из причин, по которым мы начали с IoC.
Похоже, сейчас есть два основных подхода к переключению между реализациями:
- Использовать квалификаторы
Вы можете добавить аннотацию к вашей реализации, а другую - к точке внедрения, которая сообщит контейнеру, какую вы хотите использовать. Тем не менее, вы все равно должны изменить свой код в двух местах, так что это то же самое, что реализовать подчиненный интерфейс и связать его по типу. Это также все еще жестко закодировано.
- Использовать beanconfigurer
Spring имеет эту концепцию beanconfigurer, которая просто заменяет старые xml-файлы. Вы можете обрабатывать конфигурацию в определенном классе, который сообщит контейнеру, как подключиться. Я не вижу преимущества перед старым стилем (по этой причине синтаксис xml более читабелен), но я думаю, что это дело вкуса.
Для меня единственный способ использовать автоматическую разводку по типу приличным способом - играть с classpath, так что вы можете использовать mock вместо реализаций, добавив другой класс. Но так как java classpath имеет такой удобный интерфейс, я также не думаю, что это проще, чем старый способ xml.
Итак, в конце концов, я думаю, что все сводится к вкусу. Да, автопроводка с использованием аннотаций намного проще, но она, как вы и говорите, жестко запрограммирует вашу конфигурацию в вашем коде. Возникает вопрос: действительно ли это так часто меняется, что оправдывает подход «мягкого кодирования»?