En este post voy a intentar demostrar la sencillez de dos conceptos muy importantes en Spring:
- Inversion of Control (IoC) = Inversión del Control.
- Dependecy Injection(DI) = Inyección de Dependencias.
Inversion of Control & Dependency Injection
“Es el proceso mediante el cual los objetos definen sus dependencias, bien mediante argumentos en el constructor, argumentos en un método factoría o propiedades que se asignan una vez el objeto está creado.”
La definición de estas dependencias se puede hacer con xml, anotaciones o mediante código java.
Entonces aparece en escena nuestro amigo el contenedor:
org.springframework.context.ApplicationContext
Es el contenedor quien inyecta las dependencias al crear el bean.
Este proceso es el inverso a la creación de instancias o asignación de dependencias, tanto usando la creación directa de las mismas o un mecanismo como Service Locator Pattern.
Por resumirlo mucho: Es el contenedor quien hace el trabajo de crear instancias en lugar de las clases, de ahí el nombre Inversion of Control.(Inversión del control)
No mas “a = new A(….);” este trabajo sucio se lo dejamos al contenedor (IoC container).
Bean: Un bean es un objeto que es instanciado, ensamblado o gestionado por un IoC Container.
Una de las ventajas de usar un contenedor (IoC Container), es que la gestión de dependencias ya no se hace dentro de las clases. Cada clase o Bean es autocontenida, sólo tiene que preocuparse de su alcance, será el contenedor quien le proporcione las instancias de clases que necesita.
Alta cohesión y bajo nivel de acoplamiento.
Ejemplo
Este sencillo ejemplo muestra:
- La configuración minima para ejecutar un Spring Container
- Cómo funciona la IoC o DI a un nivel muy básico
Configuración mínima
pom.xml en el cual vamos a declarar los paquetes de Spring que necesitamos
Sólo con spring-context ya nos basta.
Por dependencias transitivas, nos descargará también los paquetes del “core container”
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
</dependencies>
Configuraciones
application-context.xml
<!-- A simple bean definition -->
<bean id="messageBean" class="me.itnotes.Message">
<!-- collaborators and configuration for this bean go here -->
<property name="message" value="Hola mundo. "/>
</bean>
Pojo
public class Message {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public void processMessage(){
message=" Este es el mensaje que tengo: " +message;
}
}
Runner
public class Runner {
public static void main(String[] args) {
//Creamos el applicationContext con lo definido en application-context.xml
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
//Obtenemos el bean que se nos ha creado
Message message = (Message) applicationContext.getBean("messageBean");
//LLamada a un metodo tonoto del bean
message.processMessage();
System.out.println(message.getMessage());
//Cerrar el applicationContext
((ConfigurableApplicationContext)applicationContext).close();
}
}