Ну, Hibernate обрабатывает часть персистентности, JSP обрабатывает ваш графический интерфейс, Struts контролирует поток между страницами / действиями / и т. Д., А Spring может управлять всеми вашими компонентами, которые содержат основную бизнес-логику, вместо использования EJB. Кроме того, это может упростить кодирование ваших DAO Hibernate и управление транзакциями.
Вместо того, чтобы кодировать свой локатор для получения некоторого EJB через JNDI и все такое, вы можете просто получить Spring ApplicationContext и запросить нужный вам компонент. Все бины, определенные в Spring, могут быть связаны между собой. Если вам нужно подключить один из ваших bean-компонентов к внешнему EJB через JNDI, вы даже можете сделать это без какого-либо кода (Spring предлагает прокси-объект JNDI, который получает указанную вами ссылку и возвращает ее как объект с указанным вами интерфейсом). Это может помочь вам упростить модульное тестирование всех этих компонентов и изменить конфигурацию, ничего не перекодируя; вы можете использовать один из Spring PlatformTransactionManager для управления источником данных или указать его JTA-менеджеру контейнера J2EE; определить свой собственный источник данных в пуле или использовать источник данных вашего контейнера, опубликованный через JNDI и т. д.