lunes, 26 de agosto de 2019

Spring Boot Web Protos

Spring Boot Web Protos


https://github.com/jalbertomr/springBootWebProtos.git

Spring initializr
Logger

Se agregan Capas
Repository  --  Lenguaje Orientado a Datos.
Service        -- Lenguaje Orientado a Negocio.

En Repository se agrega Interface IPersonaRepo y su Clase que la implementa para desacoplar.

En Service se agrega Interface IPersonaService y su Clase que la implementa.

La instanciación de las clases PersonaRepoImpl y PersonaServiceImpl por el momento se implementan manualmente con new. (la desventaja de esto es que por cada cliente se creará una instanciación de estas clases).

Estructura del Proyecto.

Al ejecutar podemos ver los mensajes de log.

2019-08-23 19:47:07.722  INFO 13010 --- [           main] com.bext.SpringBootWebApplication        : Logging en SpringBoot.
2019-08-23 19:47:07.722  INFO 13010 --- [           main] com.bext.SpringBootWebApplication        : Service Alta Persona: Juan Perez
2019-08-23 19:47:07.723  INFO 13010 --- [           main] com.bext.SpringBootWebApplication        : Repository Persistiendo Persona: Juan Perez
2019-08-23 19:47:20.316  INFO 13010 --- [on(2)-127.0.0.1] inMXBeanRegistrar$SpringApplicationAdmin : Application shutdown requested.
2019-08-23 19:47:20.319  INFO 13010 --- [on(2)-127.0.0.1] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'

Usando Estereotipos para instanciar Clases.


   Para no hacer la instanciación manual, nos apoyamos de spring framework con estereotipos como  @Repository (@Bean para el nivel Repository) , @Service (@Bean para el nivel Service) , tambien existe @Component o el mismo @Bean.

  Eliminamos la instanciación manual con new y las clases se califican con @Repository y @Service y con @Autowired se le indica al framework que se encarge de manejar su instanciación.

   Al ejecutarlo el resultado es el mismo. Incluso si utilizamos indistintamente los estereotipos  @Service, @Repository, @Component.

https://github.com/jalbertomr/springBootWebProtos/commit/f34b2bef0c962354227847fd1af7f816c098db28

Distinguiendo Beans


Crearemos otro Bean de PersonaRepoImpl2, el cual es calificado con @Repository e implementa IPersonaRepo, De esta forma cuando @Autowired intenta instanciar IPersonaRepo, encuentra que hay dos, y no sabe cual usar, esto nos lo hace saber con el mensaje siguiente al ejecutar la app.

Field personaRepo in com.bext.service.PersonaServiceImpl required a single bean, but 2 were found:
    - personaRepoImpl: defined in file [/home/bext/eclipse-workspace/springBootWebProtos/target/classes/com/bext/repository/PersonaRepoImpl.class]
    - personaRepoImpl2: defined in file [/home/bext/eclipse-workspace/springBootWebProtos/target/classes/com/bext/repository/PersonaRepoImpl2.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

Si calificamos alguno de los dos con @Primary tomará este bean y no habrá ya el problema. Le ponemos @Primary al a PersonaRepoImpl2 y la respuesta es

2019-08-23 20:52:54.373  INFO 31353 --- [           main] com.bext.SpringBootWebApplication        : Logging en SpringBoot.
2019-08-23 20:52:54.374  INFO 31353 --- [           main] com.bext.SpringBootWebApplication        : Service Alta Persona: Juan Perez
2019-08-23 20:52:54.374  INFO 31353 --- [           main] com.bext.SpringBootWebApplication        : Repository2 Persistiendo Persona: Juan Perez

El log nos confirma que está utilizando el Bean PersonaRepoImpl2.

https://github.com/jalbertomr/springBootWebProtos/commit/f34b2bef0c962354227847fd1af7f816c098db28

Tambien podemos usar @Qualifier

@Repository
@Qualifier("PersonaRepo1")
public class PersonaRepoImpl implements IPersonaRepo {
...


En el otro bean

@Repository
@Qualifier("PersonaRepo2")
public class PersonaRepoImpl2 implements IPersonaRepo {
...


Al instanciarlo con @Autowired en Service lo calificamos y ese utilizará.

   @Autowired
   @Qualifier("PersonaRepo2")
    private IPersonaRepo personaRepo;


https://github.com/jalbertomr/springBootWebProtos/commit/d1943f72828be9f0c40500b0fa1569f2282221e3



eot

No hay comentarios:

Publicar un comentario