Arquitetura de aplicação web, está correto?

Pessoal, estou dando meus primeiros passos com o desenvolvimento web em Java. Estou utilizando o SpringMVC, tenho algumas dúvidas e gostaria de saber se estou no caminho correto. vamos considerar a seguinte situação:

Interface ClienteDAO

package br.com.xxx.sistema.dao;

import java.util.List;

import br.com.xxx.sistema.model.Cliente;

public interface ClienteDao {

    public Cliente findById(Integer id);
    public List findAll();
}

ClienteDaoHibernate: Implementação da interface

package br.com.xxx.sistema.dao.hibernate;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import br.com.xxx.sistema.dao.ClienteDao;
import br.com.xxx.sistema.model.Cliente;

public class ClienteDaoHibernate extends HibernateDaoSupport implements ClienteDao {

    public Cliente findById(Integer id) {
        return null;
    }

    public List findAll() throws DataAccessException {
        Session session = getSession(true);        
        try{
            List result = session.createQuery("from Cliente").list();            
            if(result == null){
                throw new RuntimeException("ResultSet inválido.") {};
            }            
            return result;
        } catch ( HibernateException ex){
            throw convertHibernateAccessException(ex);
        }
    }
}

Controller

package br.com.xxx.sistema.web.controllers.spring;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import br.com.xxx.sistema.dao.ClienteDao;

public class ListClientesController implements Controller  {
    
    private ClienteDao clienteDao;
    
    public void setClienteDao(ClienteDao clienteDao){
        this.clienteDao = clienteDao;
    }

    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {                
        Map model = new HashMap();
        model.put("listaClientes",clienteDao.findAll());
        return new ModelAndView("listarClientes",model);
    }
}

applicationContext.xml

[...]
	<bean id="ClienteDAO" class="br.com.xxx.sistema.dao.hibernate.ClienteDaoHibernate">
		<property name="sessionFactory" ref="mySessionFactory"/>
	</bean>

[...]

action-servlet.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/WEB-INF/jsp/"/>
		<property name="suffix" value=".jsp"/>
	</bean>

	<bean id="defaultHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

	<bean name="/index.html" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
		<property name="viewName" value="index" />
	</bean>

	<bean name="ListClientesController" class="br.com.xxx.sistema.web.controllers.spring.ListClientesController">
		<property name="clienteDao" ref="ClienteDAO" />
	</bean>

	<bean name="EditClienteController" class="br.com.xxx.sistema.web.controllers.spring.EditClienteController">

	</bean>

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /content/clientes/list.html=ListClientesController
                /content/clientes/edit.html=EditClienteController
            </value>
        </property>
    </bean>

</beans>

Funcionando está, mas gostaria de saber:

Está correto?

O que pode ser melhorado?

Já li várias vezes que o controller tendo acesso direto ao DAO não está correto, no meu caso, como eu poderia fazer com que o controller nao tenha acesso direto ao ClienteDao?

Obrigado pessoal.

PS.: Estava no forum desenvolvimento web, peço a um moderador que encerre aquele tópico, pois lá não obtive respostas.