Spring es uno de los frameworks mas habituales hoy en día a la hora de trabajar en JEE. Si tuviera que revisar los puntos débiles que el framework tiene , destacaría el tener que leer el fichero applicationContext.xml al iniciarle y los problemas de ClassNotFoundException que se suelen producir ya sea porque nos faltan librerias o porque hemos escrito incorrectamente el nombre de las clases.
Vamos a suponer que disponemos del siguiente fichero de configuración (applicationContext.xml).
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?></pre> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="servicioA" class="com.arquitecturajava.ServicioA"> </bean> <bean id="servicioB" class="com.arquitecturajava.ServicioB"> </bean> </beans> <pre>
Como podemos ver hemos definido dos beans en el fichero servicioA y servicioB .Podemos usarlos en un programa de consola de la siguiente forma.
Principal.java
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Principal { public static void main(String args[]) { ApplicationContext contexto = new ClassPathXmlApplicationContext("applicationContext.xml"); ServicioA servicioA= (ServicioA) contexto.getBean("servicioA"); System.out.println(servicioA.mensaje()); } }
Aunque el uso es correcto siempre aparecen problemas como por ejemplo que en el método getBean hayamos escrito ServicioA con la S “Mayuscula” o que en el fichero applicationContext.xml no esten bien puestos los nombres de las clases etc .Son errores sencillos de corregir pero son errores molestos. Vamos a ver como eliminarlos.
Spring @configuration
Spring soporta anotaciones de configuración a partir de su versión 3.0 que nos permiten enfocar de otra forma . Vamos a declarar una clase “ConfiguracionApp” que se encargue de realizar la configuración de la aplicación sin usar el fichero “applicationContext.xml” que es el que nos esta dando problemas .
package com.arquitecturajava; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ConfiguracionApp { @Bean public ServicioA servicioA() { return new ServicioA(); } @Bean public ServicioB servicioB() { return new ServicioB(); } }
Si revisamos la clase ConfiguracionApp dispone de dos anotaciones de Spring Framemork .
Spring @Configuration :Anotación encargada de definir que la clase es una clase de configuración para el framework
Spring @Bean :Anotación que marca como bean cada uno de los métodos de tal forma que esten disponibles para Spring
Realizadas estas modificaciones nuestra aplicación no necesitará utilizar ya el fichero applicationContext.xml . Todo quedará registrado con nuestra nueva clase que a nivel de compilación realizará las comprobaciones de nombres necesarias.Para usar la nueva clase de configuración con Spring en un programa de consola será tan sencillo como lo siguiente.
package com.arquitecturajava; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class PrincipalB { public static void main(String args[]) { AnnotationConfigApplicationContext contexto= new AnnotationConfigApplicationContext(); contexto.register(ConfiguracionApp.class); contexto.refresh(); ServicioA servicioA= (ServicioA) contexto.getBean(ServicioA.class); System.out.println(servicioA.mensaje()); } }
Podemos apreciar que ya no hemos usado en ningún momento Strings a la hora de invocar los diferentes “beans” registrados y podemos eliminar el fichero applicationContext.xml.
Hola Cecilio, con una duda, leyendo sobre el tema, ¿cuál sería la usabilidad de la clase con @Configuration en comparación de utilizar las anotaciones en cada clase?, como @Component @Service, entre otras, ya que sirven también para que Spring maneje los Beans, gracias.
son complementarias @service @repository etc lo que hacen es simplemente registrar beans en cambio @configuration puede ir mas a detalle y dentro del registro ejecutar métodos o funcionalidad
Qué tal Cecilio, muy buen blog, pero tengo una duda con respecto a la anotación @Bean, en teoría lo que hacemos es registrar ese objeto al contexto de Spring no? pero un ejemplo real del uso de la anotación cuál sería? no sé si podría ser por ejemplo usando la librería Gson, o alguna otra de un Jar externo y crear un método como:
@Bean
public Gson getGson() {
return new Gson();
}
y entonces poder usar ya la librería en cualquier parte de la aplicación, ¿para algo así sirve la anotación @Bean?
Saludos Cecilio!
Sirve para registrar cualquier objeto . Si en ese caso podría ser una posibilidad . Si por ejemplo muchas clases necesitan que se les inyecte ese objeto
Ok, seguiré revisando el tema para tomar más sentido a la anotación, gracias Cecilio, ¡saludos!
lamers!
[…] Línea 5: Nos encontramos ante la etiqueta @Configuration, es una anotación encargada de definir que la clase es una clase de configuración para el framework. Casi siempre suele ir acompañda de la etiqueta @Bean. Pero eso lo veremos más adelante en otro nivel. Para ampliar conocimientos recomiendo la siguiente web: https://www.arquitecturajava.com/spring-configuration/ […]
Hola. Tengo una inquietud. Como sería la inyección desde el archivo de configuración. digamos que e servicio ServicioA
depende del ServicioB ¿como se haría eso? Gracias de antemano. saludos
Con la anotación Autowired
Hola Cecilio,
He estado leyendo del tema, pienso que se podría hacer (debo probarlo), algo así:
@Configuration
public class ConfiguracionApp {
@Bean
public ServicioA servicioA() {
return new ServicioA(servicioB());
}
}
@Bean
public ServicioB servicioB() {
return new servicioB();
}
Ahora entiendo lo que intentas hacer, podrías usar Spring profiles y qualifiers para en los autowired definir una implementación u otra. Dependiendo del profile elegir cual de los dos desplieguas
Mi pana el ejemplo de la clase ‘ConfiguracionApp.java’ esta malo, ya que en ningun momento estas haciendo inyeccion de dependencia, por el contrario, estas usando el ‘new’ cual si fueses un novato!…
No hago inyeccion de dependencias porque las clases no están relacionadas , son todas independientes simplemente las construyo.
[…] artículos relacionados: PropertiesPlaceHolder , SpringConfiguration , Spring […]
Algún ejemplo de configuración de un ear con war y un ejb compartiendo el contexto de spring??
me temo que no 🙁
Está muy bien esto, pero hay algo que no me gusta y es que yo uso spring entre otras cosas para testear.
Tengo unos mock que pongo via el xml de spring y que cambio cuando paso a algo productivo. Ahora para hacer esto, tengo que recompilar todo…….
Por otro lado esto ya se parece mas a una factory que a IoC
Saludos y buenisimos el blog
Es cierto lo que dices aunque hay una tendencia al uso de las anotaciones pueden existir situaciones en el que el uso de los ficheros xml pueda ser mas cómodo.