Spring contient un grand nombre de fonctionnalités et de dispositifs, qui sont bien organisés dans sept modules comme décrit sur le diagramme suivant. Cette section décrit chaque module à tour de rôle.
Le package Core est la partie la plus fondamentale du framework et fournit la fonctionnalité Injection de Dépendance, vous permettant de gérer le conteneur de beans. Le concept de base ici est la BeanFactory qui fournit une implémentation dy pattern fabrique tout en supprimant la nécessité de programmer des singletons et permettent de découpler la configuration et la spécification des dépendances de la logique applicative elle-même.
Au sommet du package Core se trouve le package Context, fournissant un moyen d'accéder aux beans à la manière d'un framework ressemblant à un registre JNDI. Le package context hérite des fonctionnalités du package beans et ajoute le support des messages (i.e. "resource bundles"), la propagation d'événements, le chargement des ressourceset la création transparente de contextes, par exemple, par un conteneur de servlets.
Le package DAO fournit un niveau d'abstraction à JDBC qui supprime le besoin de code JDBC pénible et de gérer les codes erreurs spécifiques aux bases de données. De plus, le package JDBC fournit un moyen de gérer les transactions de manière déclarative ou par la programmation pas seulement pour les classes implémentant des interfaces spécifiques mais pour tous les POJOs (plain old java objects).
Le package ORM fournit des niveaux d'abstraction pour l'intégration des outils populaires de mappage objet-relationnel comme JDO, Hibernate et iBatis. En utilisant le package ORM, vous pouvez utiliser tous ces outils en combinaison de toutes les autres fonctionnalités qu'offre Spring, comme notamment la gestion déclarative des transactions mentionnée précédemment.
Le package AOP de Spring fournit une implémentation de la programmation orientée aspect conforme à AOP Alliance qui permet par exemple, de définir des intercepteurs de méthodes et des points de jonction en découplant proprement le code fonctionnel qui devrait être bien séparé. En utilisant les annotations au niveau des sources, il est possible d'intégrer toute sorte d'informations dans le code, un peu comme avec les attributs .Net.
Le package Web de Spring fournit des fonctionnalités d'intégration de base pour les applications web comme la gestion des requêtes multipart, l'initialisation des contextes en utilisant les listeners des servlets et un contexte d'application orienté web. Pour utiliser Spring avec WebWork ou Struts, il est indispensable d'intégrer ce package.
Le package Web MVC de Spring fournit une implémentation Model-View-Controller pour les applications web. Spring MVC n'est pas une implémentation comme les autres, car elle fournit une séparation nette entre le code du modèle et les formulaires web et permet d'utiliser toutes les autres fonctionnalités du framework Spring comme la validation.
Avec les modules décrits ci-dessus, il est possible d'utiliser Spring dans toute sorte de scénarios allant des applets aux applications d'entreprise complexes utilisant la fonctionnalité de gestion des transaction de Spring et le framework web.
Une application web typique utilise la plupart des fonctionnalités de Spring. En utilisant TransactionProxyFactoryBeans, l'application web est complètement transactionnelle comme elle l'aurait été en utilisant les transactions gérées par le conteneur des EJBs. Toute la logique métier peut être implémentée en utilisant des POJOs simples gérés par le conteneur d'Injection de Dépendance de Spring. Des services additionnels comme l'envoi de messages et la validation, indépendante de la couche web, permettent de choisir quand exécuter les règles de validation. Le support de Spring pour les ORMs est intégré avec Hibernate, JDO, iBatis. En utilisant, par exemple, HibernateDaoSupport, il est possible de réutiliser vos mappages existants. Les controleurs de formulaires s'intègrent de manière transparentes dans la couche web avec le modèle, supprimant de ce fait le besoin d'ActionForms ou d'autres classes transformant les paramètres HTTP en valeurs disponibles pour le modèle.
Parfois, il arrive qu'il soit impossible de complètement changer de framework. Spring ne force en aucun cas, l'utilisation complète du framework; il ne s'agit pas d'une solution tout ou rien. Des frameworks de présentation utilisant WebWork, Struts, Tapestry ou autre peuvent être parfaitement intégrer avec un tier métier basé sur Spring et permettant ainsi d'utiliser les fonctionnalités transactionnelles offertes par Spring. La seule chose qui doit être faite, est de récupérer la logique métier en utilisant un ApplicationContext et de l'intégrer à la couche de présentation web en utilisant WebApplicationContext.
Quand il est nécessaire d'accéder à du code existant via des services web, il est possible d'utiliser les classes Hessian-, Burlap-, Rmi- or JaxRpcProxyFactory. Utiliser l'accès distant dans une application existante n'est pas plus difficile que cela.
Spring fournit également une couche d'accès et un niveau d'abstraction pour les EJBs, permettant d'utiliser les POJOs existants et de les envelopper dans des Beans Session sans Etat, pour un usage dans des applications web scalables et résistantes aux erreurs qui nécessitent de la sécurité déclarative.