The Spring framework is the leading full-stack Java/J2EE application framework. Unlike other frameworks, Spring does not impose itself on the design of a project due to its modular nature and, it has been divided logically into independent packages, which can function independently. It provides a light weight container and a non-invasive programming model enabled by the use of dependency injection (aka IoC), AOP (Aspect Oriented Programming), and portable service abstractions (JdbcTemplate, JmsTemplate etc).
It includes abstraction layers for transactions, persistence frameworks (e.g. HibernateTemplate support for
Hibernate), Web development, a JDBC integration framework, an AOP integration framework, email support, Web Services (i.e. JAX-RPC) support etc. It also provides integration modules for popular Object-to-Relational (O/R) mapping tools like Hibernate, JDO etc. The designers of an application can feel free to use just a few Spring packages and leave out the rest. The other spring packages can be introduced into an existing application in a phased manner. Spring is based on the IoC pattern (aka Dependency Injection pattern) and also complements OOP (Object Oriented Programming) with AOP (Aspect Oriented Programming). You do not have to use AOP if you do not want to and AOP complements Spring IoC to provide a better middleware solution.
As shown in the diagram below the Spring modules are built on top of the core container, which defines how beans are configured, created and managed.