Come detto in precedenza, uno dei vantaggi di Spring è quello di essere modulare. I suoi layer principali sono:
- Core Container
- Data Access
- Web
- Aop
- Test
Il layer Core Container è formato dai moduli: Core, Beans, Context, e Expression Language. I moduli Core e Beans formano la struttura principale del framework, includendo le funzionalità di IoC e DI, che sono implementate tramite la BeanFactory, che è una implementazione sofisticata del Factory Method Pattern. La BeanFactory consente il disaccoppiamento tra definizione e configurazione delle dipendenze e la logica applicativa. Il modulo Context, basato sul modulo Beans, funge da tramite per l'accesso agli oggetti attraverso la sua intefaccia principale: ApplicationContext. L'ApplicationContext eredita tutti le funzionalità della BeanFactory, aggiungendone altre quali: supporto per l'internazionalizzazione, propagazione di eventi, caricamento di risorse, il supporto per J2EE. Il layer Expression Language offre un potente expression language per la manipolazione degli oggetti a runtime.
Il layer Data Access/Integration è formato dai sottomoduli: JDBC, ORM, OXM, JMS e Transaction. Il modulo JDBC fornisce una astrazione delle Api JDBC, creata per rendere meno tediosa la programmazione attraverso le stesse. Il modulo ORM fornisce un livello di integrazione con i popolari framework di OR mapping, come JPA, Hibernate, iBatis. Spring permette l'uso di tutte le potenzialità di questi framework, dando la possibilità di intergrarli con le proprie peculiarità, come ad esempio la gestione delle transazioni. Il layer OXM fornisce un livello di astrazione per l'Object/XML mapping per JAXB, XMLBeans e altri. Il modulo JMS contiene funzinalità per l'invio e la ricezione di messaggi, mentre il modulo Transaction offre un gestore delle transazione per tutti i tipi di classi.
Il layer Web è formato dai moduli: Web, Web-Servlet, Web-Struts e Web-Portlet. Il modulo Web contiene le funzionalità di base per creare applicationi enterprise, come ad esempio il supporto per l'upload dei file, offrendo anche l'inizializzazione del container IoC attraverso un Servlet Listener. Il modulo Web-Servlet contiene la parte di MVC del framework, mentre invece il modulo Web-Struts contiene classi per l'integrazione con Struts2, che però è sconsiglita nella versione 3 di Spring. Infine il modulo Web-Portlet offre funzionalità identiche al modulo Web-Servlet, ma orientato ad applicazioni che fanno uso di portlet.
Il layer Aop fornisce un'implementazione aderente alla AOP Alliance, permettendo una programmazione aspect-oriented. Questo layer consente di creare codice che deve essere disaccoppiato dalle altre funzionalità, anche se legato al flusso generale dell'applicativo (la parte relativa ad AOP sarà discussa nei prossimi paragrafi). Questo layer ha anche un modulo Aspects per l'integrazione con AspectJ, ed un modulo Instrumentantions che consente il monitoraggio delle classi, offrendo anche un ClassLoader che può essere usato in alcuni Application Server.
Il layer Test offre la possbiltà di testare i componenti di Spring, usando JUnit o TestNG. Questo modulo fornisce la possbilità di inizializzare e cachare ApplicationContexts per scopi di test, fornerndo anche la possibilità di usare oggetti di mock per testare il codice in isolation.