Существует 3 основных причины, IMO:
Первая причина: прокси.
Если вы запросите Spring для bean-компонента типа UserDAO, он фактически вернет прокси, инкапсулирующий фактический UserDAOImpl.пример.Это позволяет ему разграничивать транзакции, проверять авторизацию безопасности, доступ к журналу, вычислять статистику и т. Д. Это можно сделать без интерфейса, но тогда потребуется манипулирование байт-кодом.
Вторые причины: тестируемость.
При модульном тестировании бизнес-службы, которая использует UserDAO, вы обычно внедряете фиктивную реализацию UserDAO.Еще раз, это легче сделать, когда UserDAO является интерфейсом.Это возможно с конкретным классом, но это не всегда было так, и все еще проще с интерфейсом
Третья причина: разделение.
Используя интерфейс, у вас есть место, где вы определяетереальный контракт DAO для своих клиентов.Конечно, ему нужен метод setDataSource()
в конкретной реализации, но клиенты не заботятся об этом.Все, что им нужно, - это набор методов доступа к данным, предлагаемых DAO.Разделяя интерфейс и конкретную реализацию, вы убедитесь, что клиент не полагается на детали реализации DAO.