The following text comes from Pro Spring 3:
Traditionally, in the data access layer, developers will implement data access objects (DAOs) to separate the data access logic from the business logic. Those DAOs will be injected into the objects within the service layer. The intention is to make the switch
from one data access implementation to another easier. However, the DAO pattern introduces one more layer between the service layer and backend database, which has proven to be quite cumbersome in most scenarios. In addition, by using standards like JPA,
the persistence context can be injected directly into the service layer for data access, using the standard API as defined by JPA. You then have the flexibility to switch from one JPA persistence provider to another (such as from Hibernate
to Eclipselink) easily. As a result, most applications these days do not use DAO, and all the business and data access logic is encapsulated into the service layer.