A POJO is simply a Java object that does not implement any infrastructure framework-specific interfaces. The POJO-based development model is all about using Plain Old Java objects for designing and developing applications and concentrating on business logic, without worrying about external dependency, such as adding code to POJO for transaction handling, dealing with message queues and connections in the case of JMS (Java Message Service) applications, and so on. The POJO programming model enables you to unit test the code without requiring an external dependency like an EJB container or an application server, making the whole programming experience simplified.
Once you start creating applications comprised of POJO, the next thing you need to determine is how you would assemble the application out of these POJOs in a loosely coupled and consistent manner, as ultimately your goal is to run your application in J2SE or a Java EE environment. If you are planning to deploy your application in Java EE environment, you will also want to leverage container capabilities like distributed transaction management, persistence support, or JMS support. For your unit testing, you will want to run POJO without these external container dependencies. In short, we want various services to be applied to POJO in a consistent manner, so it can work in any environment. This is where the Spring framework comes in, whose aim is to provide a consistent programming model for POJO-based development, apply various services to POJO transparently, and to enable enterprise application development using POJO.
Two of the most important features you need to be aware of before understanding the Spring framework are IoC and AOP.