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!).
Hay dos elementos básicos de configuración:
El archivo ApplicationConfig.java tiene anotaciones que preparan el proyecto:
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).
En la clase ProvinciaServiceImpl tendrías que agregar algo como lo siguiente:
@Service public class ProvinciaServiceImpl implements PaisBo { @Autowired private ProvinciaDao provinciaDao; .... }
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)
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.
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.
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.