La anotación @Configuration de Spring es parte del marco principal de Spring. La anotación de configuración de Spring indica que la clase tiene métodos de definición @Bean . Por lo tanto, el contenedor de Spring puede procesar la clase y generar Spring Beans para usar en la aplicación.
Primavera @Configuración
La anotación @Configuration de Spring nos permite usar anotaciones para la inyección de dependencias . Veamos cómo crear clases de Spring Configuration. Creemos una clase Java Bean simple.
package com.journaldev.spring;public class MyBean {public MyBean() {System.out.println("MyBean instance created");}}
Antes de usar cualquiera de las clases del framework Spring, tendremos que agregar sus dependencias al proyecto maven.
dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.6.RELEASE/version/dependency
Ahora vamos a crear la clase de configuración de Spring.
package com.journaldev.spring;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class MyConfiguration { @Bean public MyBean myBean() {return new MyBean();}}
Escribamos una clase simple y configuremos nuestra clase de configuración Spring simple.
package com.journaldev.spring;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class MySpringApp {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(MyConfiguration.class);ctx.refresh();// MyBean mb1 = ctx.getBean(MyBean.class);// MyBean mb2 = ctx.getBean(MyBean.class);ctx.close();}}
Si ejecuta la aplicación anterior, producirá un resultado como este:
May 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext prepareRefreshINFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchyMyBean instance createdMay 23, 2018 12:34:54 PM org.springframework.context.support.AbstractApplicationContext doCloseINFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Wed May 23 12:34:54 IST 2018]; root of context hierarchy
Tenga en cuenta que Spring carga los beans en su contexto antes de que lo hayamos solicitado. Esto es para asegurarse de que todos los beans estén configurados correctamente y que la aplicación falle rápidamente si algo sale mal. También ctx.refresh()se debe llamar, de lo contrario obtendremos el siguiente error cuando intentemos obtener cualquier bean del contexto.
Exception in thread "main" java.lang.IllegalStateException: org.springframework.context.annotation.AnnotationConfigApplicationContext@f0f2775 has not been refreshed yetat org.springframework.context.support.AbstractApplicationContext.assertBeanFactoryActive(AbstractApplicationContext.java:1076)at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106)at com.journaldev.spring.MySpringApp.main(MySpringApp.java:11)
Si descomentas las declaraciones en las que obtengo instancias de MyBean, notarás que no se llama al constructor de MyBean. Esto se debe a que el alcance predeterminado de los beans de Spring es Singleton. Podemos cambiarlo mediante @Scopeanotaciones.
¿Qué pasa si eliminamos la anotación @Configuration ?
¿Qué sucederá si eliminamos la anotación @Configuration de la clase MyConfiguration? Notarás que sigue funcionando como se espera y los beans de Spring se registran y recuperan como clases singleton. Pero en este caso, si realizamos una llamada a myBean()un método, será una llamada a un método Java simple y obtendremos una nueva instancia de MyBean y no seguirá siendo singleton. Para probar este punto, definamos otro bean que usará la instancia MyBean.
package com.journaldev.spring;public class MyBeanConsumer {public MyBeanConsumer(MyBean myBean) {System.out.println("MyBeanConsumer created");System.out.println("myBean hashcode = "+myBean.hashCode());}}
Nuestra clase de configuración de primavera actualizada es:
package com.journaldev.spring;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;//@Configurationpublic class MyConfiguration {@Bean public MyBean myBean() {return new MyBean();}@Bean public MyBeanConsumer myBeanConsumer() {return new MyBeanConsumer(myBean());}}
Ahora, cuando ejecutamos la MySpringAppclase, genera la siguiente salida.
MyBean instance createdMyBean instance createdMyBeanConsumer createdmyBean hashcode = 1647766367
Entonces MyBean ya no es singleton. Ahora anotemos MyConfigurationcon @Configurationanotación nuevamente y ejecutemos la MySpringAppclase. Esta vez, el resultado será como el que se muestra a continuación.
MyBean instance createdMyBeanConsumer createdmyBean hashcode = 1095088856
Por lo tanto, es mejor usar @Configurationanotaciones con clases de configuración para asegurarnos de que nuestro contenedor Spring se comporte como queremos. Si no desea utilizar la anotación @Configuration por alguna extraña razón, aún podemos crear nuestra clase de configuración sin llamar al myBean()método y, en su lugar, utilizando una variable de instancia de MyBean configurada a través de la anotación @Autowired . Algo como el código a continuación también funcionará.
package com.journaldev.spring;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;//@Configurationpublic class MyConfiguration {@AutowiredMyBean myBean;@Bean public MyBean myBean() {return new MyBean();}@Bean public MyBeanConsumer myBeanConsumer() {return new MyBeanConsumer(myBean);}}
Eso es todo para la anotación de configuración de resorte, analizaremos otras anotaciones de resorte en futuras publicaciones.
Puede descargar el código de ejemplo desde nuestro repositorio de GitHub .