Interfaces BeanNameAware y BeanFactoryAware en Spring

1. Información general

En este tutorial rápido, nos centraremos en las interfaces BeanNameAware y BeanFactoryAware , en Spring Framework .

Describiremos cada interfaz por separado con los pros y los contras de su uso.

2. Interfaz consciente

Tanto BeanNameAware como BeanFactoryAware pertenecen a la interfaz de marcador raíz org.springframework.beans.factory.Aware . Esto usa la inyección de setter para obtener un objeto durante el inicio del contexto de la aplicación.

La interfaz Aware es una combinación de patrones de diseño de devolución de llamada, escucha y observador . Indica que el bean es elegible para ser notificado por el contenedor Spring a través de los métodos de devolución de llamada.

3. BeanNameAware

BeanNameAware hace que el objeto conozca el nombre del bean definido en el contenedor .

Echemos un vistazo a un ejemplo:

public class MyBeanName implements BeanNameAware { @Override public void setBeanName(String beanName) { System.out.println(beanName); } }

La propiedad beanName representa el ID de bean registrado en el contenedor Spring. En nuestra implementación, simplemente mostramos el nombre del bean.

A continuación, registremos un bean de este tipo en una clase de configuración Spring:

@Configuration public class Config { @Bean(name = "myCustomBeanName") public MyBeanName getMyBeanName() { return new MyBeanName(); } }

Aquí hemos asignado explícitamente un nombre a nuestra clase MyBeanName con la línea @Bean (name = “myCustomBeanName”) .

Ahora podemos iniciar el contexto de la aplicación y obtener el bean de él:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MyBeanName myBeanName = context.getBean(MyBeanName.class);

Como esperamos, el método setBeanName imprime "myCustomBeanName" .

Si eliminamos el código name = “…” de la anotación @Bean, el contenedor, en este caso, asigna el nombre del método getMyBeanName () al bean. Entonces la salida será "getMyBeanName" .

4. BeanFactoryAware

BeanFactoryAware se utiliza para inyectar el objeto BeanFactory . De esta manera obtenemos acceso a BeanFactory que creó el objeto.

Aquí hay un ejemplo de una clase MyBeanFactory :

public class MyBeanFactory implements BeanFactoryAware { private BeanFactory beanFactory; @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } public void getMyBeanName() { MyBeanName myBeanName = beanFactory.getBean(MyBeanName.class); System.out.println(beanFactory.isSingleton("myCustomBeanName")); } }

Con la ayuda del método setBeanFactory () , asignamos la referencia BeanFactory del contenedor IoC a la propiedad beanFactory .

Después de eso, podemos usarlo directamente como en la función getMyBeanName () .

Inicialicemos MyBeanFactory y llamemos al método getMyBeanName () :

MyBeanFactory myBeanFactory = context.getBean(MyBeanFactory.class); myBeanFactory.getMyBeanName();

Como ya hemos creado una instancia de la clase MyBeanName en el ejemplo anterior, Spring invocará la instancia existente aquí.

La línea beanFactory.isSingleton (“myCustomBeanName”) lo verifica.

5. ¿Cuándo usarlo?

El caso de uso típico de BeanNameAware podría ser adquirir el nombre del bean para fines de registro o cableado. Para BeanFactoryAware , podría ser la capacidad de usar un bean de primavera del código heredado.

En la mayoría de los casos, debemos evitar el uso de las interfaces de Aware , a menos que las necesitemos. La implementación de estas interfaces acoplará el código al marco Spring.

6. Conclusión

En este artículo, aprendimos sobre las interfaces BeanNameAware y BeanFactoryAware y cómo usarlas en la práctica.

Como de costumbre, el código completo de este artículo está disponible en GitHub.