Spring Framework, muy básicamente, es un framework de inyección de dependencia. Se encargará de construir objetos por nosotros, y setearle todas las dependencias que ese objeto necesite. Además es un framework de aplicación, en el sentido que también resuelve muchas problemáticas habituales.
Hoy en día, Spring es un estandar-de-facto: en la práctica es un framework adoptado mundialmente como el framework a partir del cual se construyen aplicaciones.
Una de las características principales de Spring es que, en la mayoría de los casos, no es intrusivo: no es necesario modificar el código de la aplicación para beneficiarse de su uso. Es decir, una aplicación cualquiera (como la que ya desarrollaste hasta ahora) se puede beneficiar con Spring sin necesidad de realizarle modificaciones.
¿Y cómo es esto posible?
Como dijimos, Spring es un factory de objetos. Es decir, se encargará de construir por nosotros objetos (nos evitará hacer el "new Clase()..."). Pero además de constuir las clases cuando se lo pidamos, le inyectará las dependencias que esa clase tenga, construyendo los objetos según sea necesario (y, recursivamente, seteando las dependencias de los objetos dependientes).
Es decir, Spring es un factory de objetos que inyecta dependencias.
Estos objetos en Spring se conocen como "beans". Una clase se define como bean al agregarle alguna de estas anotaciones: @Component, @Controller, @RestController, @Service, @Repository. Además, allí mismo se declaran las propiedades del objeto que tienen dependencias a otros beans marcandolas con la anotación @Autowired.
Te recomiendo que leas los siguientes artículos introductorios a Spring:
Veremos cómo resolver finalmente la inyección de dependencia en forma transparente, usando Spring como framework de aplicación.