코어 컨테이너 - 그림에서 가장 아래쪽에 위치하는 것이 스프링의 코어 컨테이너이다. 이것은 스프링의 기본 기능을 제공한다. 이 모듈에 있는 BeanFactory는 스프링의 기본 컨테이너이자 스프링 DI의 기반이다.
애플리케이션 컨텍스트 모듈 - 스프링의 애플리케이션 컨텍스트는 코어 컨테이너 위에 올라간다. 코어 모듈의 BeanFactory가 스프링을 컨테이너로 만들어 준다면, 컨텍스트 모듈은 스프링을 프레임워크로 만들어 준다. 국제화(I18N) 메시지, 애플리케이션 생명주기 이벤트, 유효성 검증 등을 지원하고, 이메일, JNDI 액세스, EJB 통합, 리모팅, 스케줄링 등 여러가지 엔터프라이즈 서비스를 제공한다. 또한 벨로시티(Velocity)나 프리마커(FreeMarker) 같은 템플릿 프레임워크와의 통합도 지원한다.
스프링 AOP 모듈 - 스프링은 AOP 모듈을 통해 애스펙트 지향 프로그래밍을 풍부하게 지원한다. AOP 모듈은 스프링 애플리케이션에서 애스펙트를 개발할 수 있는 기반이 되는 것으로서, DI처럼 애플리케이션 객체 간의 결합도를 낮추는 데 기여한다. AOP는 주로 애플리케이션 전체에 걸친 관심사(트랜잭션이나 보안 등)와 각 객체 간의 결합도를 낮추는데 이용된다.
JDBC 추상화와 DAO 모듈 - JDBC를 이용해 작업하다 보면 커넥션을 얻어오고, 스테이트먼트를 생성하고, 결과 셋을 처리하고 커넥션을 닫는 코드를 수없이 반복하게 된다. 스프링의 JDBC와 DAO(Data Access Object) 모듈은 이렇게 반복되는 코드를 추상화하므로 이 모듈을 이용하면 데이터베이스 관련 코드를 깔끔하고 간단하게 만들 수 있고, 데이터베이스 리소스를 닫지 않아서 발생할 수 있는 문제를 예방할 수 있다. 또한 이 모듈에는 여러 종류의 DB 서버가 제공하는 오류 메시지 위에, 의미 있는 예외 계층이 추가되어 있다.
ORM 통합 모듈 - 스프링의 ORM 모듈은 JDBC보다 객체 관계 매핑(ORM: object-relational mapping) 도구를 선호하는 사람들을 위한 것이다. 스프링의 ORM 모듈은 DAO 모듈위에 올라가서 ORM 솔루션용 DAO를 만드는 편리한 방법을 제공한다. 스플리은 고유한 ORM 솔루션을 구현하지 않고, 하이버네이트, 자바 퍼시스턴스 API, 자바 데이터 객체(JDO), iBATIS SQL Maps 등 널리 사용되는 ORM 프레임워크와의 연결고리를 제공한다. 스프링의 트랜잭션 관리 기능은 JDBC 뿐만 아니라 이 ORM 프레임워크들도 지원한다.
JMX - 애플리케이션 관리 입장에서 자바 애플리케이션의 내부 작동내용을 외부로 노출하는 것은 애플리케이션을 운영 단계로 진입시키는 데 있어 매우 중요한 부분이다. 스프링의 JMX(Java Management Extensions) 모듈을 이용하면 애플리케이션의 빈을 JMX MBeans로 쉽게 노출할 수 있다. 이 모듈을 이용하면 실행 중인 애플리케이션을 모니터링하고 재구성 할 수 있다.
JCA - 엔터프라이즈 애플리케이션 분야의 풍경은 일련의 이종 서버와 플랫폼들 위에서 돌아가는 다양한 애플리케이션으로 어지럽게 뒤옆여 있다. 이 다양한 애플리케이션을 통합하는 것은 쉽지 않은 일이다. JCA(Java EE Connection API)는 메인프레임을 포함한 다양한 엔터프라이즈 정보 시스템이나 DB와 자바 애플리케이션을 통합하는 표준을 제공한다.
스프링 MVC 프레임워크 - 모델/뷰/컨트롤러(MVC) 패러다임은 사용자 인터페이스가 애플리케이션 로직과 분리되는 웹 애플리케이션을 만드는 경우에 일반적으로 사용되는 패러다임이다. 자바에는 아파치 스트럿츠(Apache Struts), JSF, 웹워크(WebWork), 태피스트리(Tapestry) 등 유명한 것만 해도 MVC 프레임워크가 많이 있다. 이 프레임워크들과 스프링이 잘 통합되기는 하지만, 애플리케이션의 웹 계층에서 결합도를 낮추는 스프링의 기술을 잘 반영하는 스프링 MVC 프레임워크도 별도로 만들어져 있다.
스프링 포틀릿 MVC - 웹 애플리케이션 대부분은 페이지 기반으로 만들어져 있다. 즉, 애플리케이션에 요청을 하면 그 요청의 결과로 매번 완전히 새로운 페이지가 표시된다. 이 페이지는 특정한 정보를 나타내거나 사용자를 특정한 폼으로 유도한다. 반면에 포틀릿 기반 애플리케이션은 하나의 웹 페이지에 여러 개의 기능을 모아둔다. 이렇게 하면 여러 개의 애플리케이션을 한번에 볼 수 있다.
스프링 웹 모듈 - 스프링 MVC와 스프링 포틀릿 MVC는 스플링 애플리케이션 컨텍스트 로딩과 관련한 약간은 특별한 요구사항을 갖는다. 그래서 스프링 웹 모듈은 스프링 MVC와 스프링 포틀릿 MVC를 지원하는 용도의 클래스들을 제공한다. 이 웹 모듈에는 멀티파트 업로드나 비즈니스 객체에 요청 파라미터를 프로그래밍 방식으로 바인딩하는 것 같은 웹 기반 작업들을 지원하는 기능이 포함되어 있고, 아파치 스트럿츠나 JSF(Java Server Faces)와 통합하는 기능도 포함되어 있다.
리모팅 - 독립적으로 실행되는 애플리케이션은 많지 않다. 대부분은 작업을 수행하기 위해 다른 애플리케이션의 기능을 이용해야 하는 경우가 많다. 네트워크를 통해 다른 애플리케이션에 액세스할 때는 통신을 위해 어떤 형태로든 일종의 리모팅(remoting)이 필요하다. 스프링의 리모팅을 이용하면 자바 객체의 기능을 원격 객체로 노출할 수 있다. 반대로 원격 객체에 원격으로 액세스하는 경우에 스프링의 리모팅 모듈을 이용하면 원격 객체를 로컬 POJO인 것처럼 손쉽게 연결해서 사용할 수 있다. 리모팅에는 원격 메서드 호출(RMI: Remote Method Invocation), Hessian, Burlap, JAX-RPC와 스프링의 HTTP Invoker 등의 방식을 사용할 수 있다.
JMS - 리모팅의 단점은 네트워크의 신뢰성에 의존적이고 양단 간에 통신이 가능해야 한다는 데 있다. 그러나 메시지 기반 통신은 훨씬 신뢰성이 높고 네트워크와 말단의 신뢰성이 낮은 경우에도 메시지 전달을 보증한다. 스프링의 자바 메시지 서비스(JMS: Java Message Service) 모듈을 이용하면 JMS 메시지 큐(queue)와 토픽(topic)에 메시지를 보내거나, 비동기 방식으로 메시지 소비가 가능한 메시지 기반 POJO를 만드는 데 도움을 얻을 수 있다.