Spring Framework – Inyección de dependencias utilizando la configuración de Java

En Spring a partir de la versión 4, el lugar donde se deben configurar los beans es en los metadatos de configuración. Los metadatos de configuración se pueden definir de 4 maneras:
- XML
- Anotaciones Java
- Código Java
- Configuración maravillosa
Para la DI utilizando la configuración de Java, debe utilizar una clase JavaConfig y anotarla con @Configuration . Dentro de esa clase, se declaran algunos métodos que devuelven beans (instancias configuradas de ciertas clases POJO que estarán disponibles en el contexto de Spring) y estos métodos deben anotarse con @Bean .
Aquí hay un ejemplo:
package fs.david @Configuration public class PersonalConfig { @Bean public NuestraBeanClass nuestraBeanClass { return new NuestraBeanClass(); } }
Es importante mencionar el hecho de que el nombre del bean en el contexto será el mismo que el nombre del método y, si desea un nombre diferente, deberá usar el atributo de nombre para la anotación @Bean.
@Bean(name="unNombrePersonal")
Para inyectar un bean en otro, simplemente llama al método que crea el bean y Spring intercepta la llamada para que el método devuelva el bean existente en lugar de ejecutarse nuevamente:
package fs.david @Configuration public class PersonalConfig{ @Bean public NuestraBeanClass nuestraBeanClass{ return new nuestraBeanClass(); } @Bean public BeanConInyeccion beanConInyeccion(){ return new BeanConInyeccion(nuestraBeanClass()); } }
O, alternativamente, configura un parámetro de algún tipo que ya sea un bean para el método y todo se conectará automáticamente:
package fs.david @Configuration public class PersonalConfig{ @Bean public NuestraBeanClass nuestraBeanClass{ return new NuestraBeanClass(); } @Bean public BeanConInyeccion beanConInyeccion(NuestraBeanClass nuestraBeanClassObject){ return new BeanConInyeccion(nuestraBeanClassObject); } }
Para usar esta clase de configuración, debe usar una implementación adecuada de ApplicationContext. Por lo general, se utilizará AnnotationConfigApplicationContext .
package fs.david public static void main(String[] args){ ApplicationContext context = new AnnotationConfigApplicationContext(PersonalConfig.class); NuestraBeanClass bean = context.getBean(NuestraBeanClass.class); /* Aquí haces algo con el bean */ }
El ApplicationContext puede instanciarse sin ninguna clase de configuración especificada y, en ese caso, puede proporcionarla utilizando el método .register() .
package fs.david public static void main(String[] args){ ApplicationContext context = new AnnotationConfigApplicationContext(); context.register(PersonalConfig.class); context.register(Config2.class); context.refresh(); NuestraBeanClass bean = context.getBean(NuestraBeanClass.class); /* Aquí haces algo con el bean */ }
Presta atención al método .refresh() .
También hay algunas cosas más que mencionar sobre las clases de @Configuration:
- Usa @Import para fusionar varias clases de @Configuration
- Usa @Autowire y @Value dentro de las clases de @Configuration ya que estas clases son beans en sí mismas
La combinación de estilos XML y JavaConfig es posible de las siguientes maneras:
- La forma centrada en XML se realiza cuando utiliza principalmente metadatos XML y una configuración de aplicación basada en XML. Por ejemplo, usa ClassPathXmlApplicationContext. En este caso, debes configurar el archivo de metadatos XML para que permita utilizar las anotaciones @Configuration y @Autowired en las clases JavaConfig que se declararán como beans. Esto se logra mediante:
<beans> <!-- El siguiente tag habilita para @Autowired y @Configuration --> <context:annotation-config/> <!-- Aquí hacemos referencia a la configuración de clase declarandola como un bean, porque cualquier clase @Configuration es un bean --> <bean class="com.foo.AlgunaConfigClass"/> <bean class="com.foo.AlgunaPojoBeanClass"/> </beans>
Debido a que la anotación @Configuration está metaanotada con la anotación @Component, cualquier clase de @Configuration es candidata para el escaneo de componentes. En esencia, eso significa que puede buscar la clase JavaConfig si proporciona la siguiente línea de código en su configuración XML:
<context:component-scan base-package="com.foo"/>
- En la forma centrada en la configuración de JavaConfig y XML, tienes que usar la anotación @ImportResource para usar metadatos XML en una configuración JavaConfig. Puedes usarlo después de la anotación @Configuration. Con esto, estás importando la definición XML a la clase config.