Ejemplo de inversión de control en Java

robotics-2180263_1920

Supongamos que tenemos varios módulos y todos requieren usar un mismo servicio o recurso. ¿Qué hacemos? ¿Escribimos líneas y más líneas de código para hacer exactamente las mismas tareas? Podría ser. Pero sería muy tedioso. Para ahorrar escribir y escribir lo mismo podemos optar por usar patrones de diseño.

Inversión de control (for Dummies):

Básicamente es un patrón de diseño que nos permite desacoplar unos módulos de otros.

Ejemplo. Crearemos una interface (una clase puramente abstracta en Java) y dos clases que la implementen, después una clase llamada Contenedor que hará uso de esa interface y tendrá sus propios métodos. Finalmente una clase principal llamada Main que servirá para ejecutar la aplicación.

Servicio.java

/**
*
*@description Clase puramente abstracta
*/
package com.codemonkey;
public interface Servicio{

public abstract void mensaje();

}

ServicioImplA.java

/**
*
*@description Implementación de Servicio
*/
package com.codemonkey;
import static java.lang.System.out;

public class ServicioImplA implements Servicio {

@Override public void mensaje(){

out.println("Mensaje desde clase ServicioImplA");

}

}

ServicioImplB.java

/**
*
*@description Implementación de Servicio
*/
package com.codemonkey;
import static java.lang.System.out;

public class ServicioImplB implements Servicio {

@Override public void mensaje(){

out.println("Mensaje desde clase ServicioImplB");

}

}

Contenedor.java

/**
*@description Clase Contenedor
*
*/
package com.codemonkey;
public class Contenedor{

private Servicio servicio;

public Contenedor(Servicio servicio){

this.servicio=servicio;

}

public void mensaje(){

servicio.mensaje();

}

}

Main.java

/**
*
*@description Clase principal
*/
package com.codemonkey;
public class Main{

public static void main(String[] args){

Servicio servImplA = new ServicioImplA();

Servicio servImplB = new ServicioImplB();

Contenedor contenedor = new Contenedor(servImplA);

contenedor.mensaje(); //implementación: ServicioImplA

contenedor = new Contenedor(servImplB);

contenedor.mensaje(); //implementación: ServicioImplB

}

}

En conclusión, el contenedor (Contenedor.java) debería poder gestionar cualquier objeto, cualquier valor o argumento de cualquier método de cualquier clase.

Definiendo dependencia de Beans con Java Config en Spring Framework

I found it hard to choose a topic to describe in my first blog post. I wanted it not to be too trivial, nor too complicated It turned out that there are many basic concepts in Spring Framework that can be confusing. Java-based configuration is one of them. I hear my colleagues asking from time…

via Defining Bean Dependencies With Java Config in Spring Framework — DZone Java Zone

Usar Lombok con Gradle

Antes de empezar podrías leer esto: Aquí.

¿Qué necesitamos?

  1. Tener instalado Gradle (ver aquí)
  2. Crear la estructura de directorios (ver aquí)
  3. Crear tres clases: Main.java, Persona.java y Usuario.java
  4. Crear un archivo build.gradle para construir el proyecto, en este archivo definiremos las dependencias (así como un listado) y características del proyecto.

Persona.java

package org.codemonkey;

import lombok.Data;
import lombok.Setter;
import lombok.Getter;

@Data
public  class Persona{
  @Getter @Setter private int id;
  @Getter @Setter private String nombre;
  @Getter @Setter private String apellidos;
  @Getter @Setter private int edad;
  @Getter @Setter private int peso;
  @Getter @Setter private int talla;
}

Usuario.java

 package org.codemonkey;

import lombok.Data;
import lombok.Setter;
import lombok.Getter;
@Data
public class Usuario extends Persona{
  @Getter @Setter private int id;
  @Getter @Setter private String usuario;
  @Getter @Setter private String password;
  @Getter @Setter private boolean logeado;
}

Como se puede ver, Lombok nos permite ahorrar código. Tanto los métodos getter y setter de nuestras clases Persona (clase padre) y Usuario (clase) hija no tienen escritos esos métodos, Lombok es quien los define a la hora de la compilación. La clase Main se encargará de servir como clase principal.

Main.java

 package org.codemonkey;

import static java.lang.System.out;
import static java.lang.System.err;

public class Main{
	public static void main(String[] args) {
		Usuario us=null;
		try{
			us=new Usuario();
			us.setId(12);
			us.setUsuario("Ariel");
			us.setPassword("/6%·@|000");
			us.setLogeado(true);
			out.println("Id:"+us.getId());
			out.println("Usuario:"+us.getUsuario());
			out.println("Password:"+us.getPassword());
			if(us.isLogeado() == true){
				out.println("Logeado!");
			}

		}catch(Exception ex){
			err.println("Error:"+ex.toString());
		}
	}
}

El siguiente archivo nos servirá para construir el proyecto:

build.gradle

/**
*
*@date 25 de junio de 2017
*@author codemonkey junior
*@description Uso de Gradle con Java
*/
apply plugin:'java'
apply plugin:'application'
apply plugin: 'project-report'
apply plugin: 'eclipse' 

//defaultTasks 'build'

sourceCompatibility = '1.8'
version = '0.0.1'
mainClassName= 'org.codemonkey.Main'
description ="""
Ejemplo de proyecto hecho con Gradle build

Codemonkey Junior Blogspot

"""

jar {

	baseName='principal'

	from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }

	manifest{
		attributes 'Main-Class': 'org.codemonkey.Main'
	}
}

repositories {
	mavenCentral()
}

dependencies {
	compile group: 'org.projectlombok', name: 'lombok', version: '1.16.16'
}

project.configurations.compile.resolvedConfiguration.resolvedArtifacts.each {
 println '   [Dependencias] '
 println 'artifact: '+it.name // << the artifact name
 println 'referencia: '+it.file // << the file reference
 println '**************************'
}

¿Cómo compilar y ejecutar el proyecto?
-Construimos:

$gradle build

-Listamos tareas disponibles:

$gradle task

-Ejecutamos y observamos el resultado:

 $gradle run

Resultado:

Selección_729