Когда вы определяете интерфейс для ваших классов, это помогает с внедрением зависимостей. Ваши конфигурационные файлы Spring сами по себе не имеют ничего об интерфейсах - вы просто указываете имя класса.
Но если вы хотите внедрить другой класс, который предлагает «эквивалентную» функциональность, использование интерфейса действительно помогает.
Например, говоря, что у вас есть класс, который анализирует контент веб-сайта, и вы внедряете его с помощью Spring. Если классы, в которые вы вводите его, знают, что это за класс, то для того, чтобы изменить его, вам придется изменить весь код, чтобы использовать другой конкретный класс. Но если вы создали Analyzer
интерфейс, вы могли бы так же легко ввести свой исходный DefaultAnalyzer
, как вы могли бы смоделировать DummyAnalyzer
или даже другой, который по сути делает то же самое, например PageByPageAnalyzer
или что-то еще. Чтобы использовать один из них, вам просто нужно изменить имя класса, которое вы вводите в свои конфигурационные файлы Spring, а не проходить через изменение кода в других классах.
Мне потребовалось полтора проекта, прежде чем я действительно начал понимать полезность. Как и большинство вещей (на корпоративных языках), которые оказываются полезными, сначала это кажется бессмысленным дополнением работы, пока ваш проект не начнет расти, а затем вы узнаете, сколько времени вы сэкономили, выполнив немного больше работы заранее.