Ваши DAO всегда являются интерфейсами, они никогда не являются классом. Этот DAO - в основном шаблон проектирования. Такое разделение DAO и его реализация дает хороший метод для разделения механизма сохранения объектов и логики доступа к данным.
Сегодня в XML-файле bean, который вы упомянули,
<bean name="ServiveDao" class="com.example.ServiceImplHibnernate">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Но завтра вы можете захотеть, чтобы ваше приложение использовало другую реализацию, сделанную вами, без изменения клиентского кода. Например, вы переписали реализацию, используя ibatis с дополнительными функциями, чтобы соответствовать вашим требованиям. Так ты пишешь класс
class ServiceImplIBAtis implements ServiceDao {..}
и измените xml-файл для загрузки вашей реализации
<bean name="ServiveDao" class="com.mycompany.ServiceImplIBAtis">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Везде, где есть ссылка на компонент ServiceDao, пружина внедряет экземпляр ServiceImplIBAtis вместо ServiceImplHibnernate. Теперь вашему приложению не нужно знать, что меняется в фоновом режиме. Все, что ему нужно знать, - это дао, называемое Service, и методы, которые можно использовать для доступа к данным.