Usando Spring Framework en nuestro proyecto

El proyecto utiliza Spring Boot para facilitar toda la configuración de Spring Framework, y ya se encuentra listo para usar. Spring Boot es un sub-proyecto de Spring Framwork, que se encarga de brindar configuraciones comunes para facilitar la implementación de Spring en nuestro proyecto. Spring Boot es el mecanismo clásico para empezar a usar Spring en un proyecto cualquiera, ya que simplifica muchísimo la configuración general (y nos evita tener que configurar a mano un montón de cosas!).

Los archivos de configuración

Hay dos elementos básicos de configuración:

  • ApplicationConfig.java
  • application.properties

El archivo ApplicationConfig.java tiene anotaciones que preparan el proyecto:

  • @Configuration, que indica que esta clase será usada para Spring como referencia de configuración.
  • @EnableAutoConfiguration, que preconfigura Spring con varios valores predeterminados útiles (levantar el archivo application.properties, preparar las base de datos, etc.)
  • @ComponentScan, que buscará otros componentes de la aplicación desde este paquete.

En principio, deberemos declarar 2 beans: nuestro Service y nuestro Repository. Para esto deberemos agregar la anotación adecuada a nuestro Service y Repository, ya que Spring buscará estas anotaciones para configurar nuestros objetos.

Así, tendremos entonces nuestros dos beans declarados para Spring. Recordá que el Service tiene una dependencia con el Repository, por lo cual tendrás que agregarle la anotación @Autowired al atributo! (fijate el ejemplo de la clase de Pais).

Configuración para el Service

En la clase ProvinciaServiceImpl tendrías que agregar algo como lo siguiente:

@Service
public class ProvinciaServiceImpl implements PaisBo {

 @Autowired private ProvinciaDao provinciaDao;
....
} 

Configuración del Repository

En la clase ProvinciaRepositoryImpl tendrías que agregar algo como lo siguiente:

@Repository
public class ProvinciaRepositoryImpl implements ProvinciaRepository {
.........
} 

(Como todavía el Repository es Dummy y no accede a la BD podemos tambien anotarlo con @Component)

Refactor del test

El siguiente paso será realizar un test que utilice el factory de Spring para obtener el test. Reusaremos entonces nuestro test de componentes del Service que ya teníamos creado.

Este test creaba un Repository "a mano", y se lo seteaba explícitamente a nuestro Service.

Lo que haremos será usar Spring para obtener nuestro Service, en vez de instanciarlo manualmente. Y este Service ya tendrá el Repository cargado.

Para esto, nos valdremos de una anotación utilitaria de Spring para los tests: la anotación @Transactional y @TransactionConfiguration.

Te sugiero que revises las clase PaisServiceComponenteTest para ver un ejemplo de uso de esta clase.

Obtener el Service

Nos quedará obtener el Service en el test. Esto es muy simple: declararemos un atributo de instancia en el test de ProvinciaService, y lo anotaremos con @Autowired. Esta anotación de Spring inyectará automáticamente el objeto, basado en su tipo.

@Autowired
private ProvinciaService instance; 

Este Service que será inyectado por Spring ya tendrá todas las dependencias seteadas, y es el que usaremos luego en los tests.

Conclusión

Finalmente hemos resuelto nuestro problema de dependencias: Spring se encargará de setear las dependencias por nosotros, y administrará también la creación de objetos. Los Service ahora son realmente independientes entre si, y no conocen las implementaciones de sus dependencias.

¿Y qué pasa con nuestro Repository? A continuación crearemos una implementación que accederá a una base de datos real para obtener las provincias.

Veremos cómo resolver finalmente la inyección de dependencia en forma transparente, usando Spring como framework de aplicación.