The  technology  that  Spring  is  most  identified  with  is  the Dependency  Injection  (DI) flavor  of Inversion of Control. The Inversion of Control (IoC) is a general concept, and it can be expressed in many different ways and Dependency Injection is merely one concrete example of Inversion of Control.
When  writing  a  complex  Java  application,  application  classes  should  be  as  independent  as possible of other Java classes to increase the possibility to reuse these classes and to test them independently  of  other  classes  while  doing  unit  testing.  Dependency  Injection  helps  in  gluing these classes together and same time keeping them independent.
What  is  dependency  injection  exactly?  Let's  look  at  these  two  words  separately.  Here  the dependency  part  translates  into  an  association  between  two  classes.  For  example,  class  A  is dependent on class B. Now, let's look at the second part, injection. All this means is that class B will get injected into class A by the IoC. 
Dependency  injection  can  happen  in  the  way  of  passing  parameters  to  the  constructor  or  by post-construction  using  setter  methods.  As  Dependency  Injection  is  the  heart  of  SpringFramework, so I will explain this concept in a separate chapter with a nice example.