Registro dinámico de beans en el contexto de Spring.

0
1896

0. Índice de contenidos.


1. Introducción.

En este tutorial veremos cómo registrar de forma dinámica beans dentro del contexto de Spring, en tiempo de inicialización.

Lo normal es que tengamos el control sobre las instancias de los beans a registrar dentro del contexto de inyección de dependencias de Spring, pero podemos encontrarnos con situaciones en las que el número de beans del mismo tipo sea dinámico y venga dado por la propia configuración de entorno.

Con el soporte de Spring Boot podemos ver ejemplos de dicho registro dinámico, como en el soporte que proporciona de fábrica para definir múltiples datasources.

Pero, ¿cómo lo hace internamente?, ¿cómo podríamos nosotros crear beans, de forma dinámica, en función de nuestras necesidades?, en este tutorial veremos cómo hacerlo.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.5 GHz Intel Core i7, 16GB DDR3).
  • Sistema Operativo: Mac OS Sierra 10.12.5
  • Oracle Java: 1.8.0_25
  • Spring Boot 1.5.4.RELEASE
  • Spring 4.3.9


3. Registro dinámico basado en el escaneo de clases.

En este primer ejemplo vamos a ver cómo podemos registrar un número indeterminado de beans basándonos en el escaneo de clases y, en concreto,
en la búsqueda por reflexión de clases anotadas con una anotación de clientes de servicios web de jax-ws.

Imaginad que tenemos una librería de clientes de servicios web generada o autogenerada en base a una definición de contrato de servicios web
y queremos registrar un proxy de apache-cxf en el contexto de Spring para hacer uso de los mismos de forma transparente.

Podríamos tener un post procesador con un código como el siguiente:

El procesador espera tener definidas únicamente un par de propiedades:

  • jaxws.clients.basePackage: con el paquete base de escaneo, sino lo escanea todo,
  • jaxws.clients.<webServiceClientName>.endPoint: con la url del endPoint en el entorno correspondiente.

y estas propiedades pueden estar definidas en cualquier fichero dentro de la jerarquía de lectura de propiedades de Spring y/o Spring Boot.

Se ejecuta en el arranque del contexto de Spring justo después de la configuración convencional, pero sin haber instanciado aun ningún bean,
es por ello que para la lectura de propiedades debemos acceder a las mismas programáticamente.

Solo nos quedaría configurar el procesador como cualquier otro bean en una clase de @Configuration, pero con un modificador static.


4. Registro dinámico basado en la lectura de propiedades.

Podemos usar otra técnica que nos permitirá el registro múltiple de beans de forma dinámica basado en la lectura de propiedades.

Imaginad que ahora queremos declarar e instanciar tantos beans de un mismo tipo como propiedades tengamos definidas con un prefijo concreto. Podrían ser clientes de mensajería y necesitaríamos crear tantas plantillas de jms como número de ocurrencias en nuestras properties.

Lo primero que podemos hacer es definir una interfaz para la definición dinámica de múltiples beans, como la siguiente:

A continuación podemos registrar un postprocesador que recuperando instancias de la factoría de beans ya registrados del tipo de interfaz anterior,
registre de forma dinámica instancias de los mismos.

Quedaría declarar el procesador como sigue:

Y, a partir de ese momento, podemos definir en cualquier @Configuration beans de tipo MultiBeanFactory, para declarar el posterior registro
de forma dinámica de beans de un tipo concreto.

Lo más interesante de todo es la lectura de propiedades para, en función del array encontrado se declaren tantos beans
como sea necesario. Para ello nos apoyamos en una clase de propiedades que se enriquece gracias al soporte de la clase RelaxedDataBinder
de Spring Boot.

Cualquier fichero de propiedades podría tener el siguiente contenido y se generarían tantas plantillas como “channel” se definan:


5. Referencias.


6. Conclusiones.

Hace más de 10 años que escribíamos el primer tutorial sobre registro dinámico de beans en el contexto de Spring, el ecosistema de Spring se ha ampliado
mucho, pero la esencia sigue siendo la misma.

Un saludo.

Jose

Dejar respuesta

Please enter your comment!
Please enter your name here