No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Ejemplo de creaci贸n de dependencia propia

12/31
Recursos

Aportes 32

Preguntas 14

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Reg铆strate o inicia sesi贸n para participar.

Si quieres acceder r谩pido a la implementaci贸n de un m茅todo sin pasar por la interfaz, presiona Ctrl + Alt y luego clic sobre el m茅todo y te lleva a la implementaci贸n.

No se si le pas贸 a otros en esta clase, pero aun prestando fuerte atenci贸n a las anteriores, cuando la vi por primera vez no me qued贸 claro por qu茅 se ten铆a que crear el archivo MyConfigurationBean.java; despu茅s de devolverme varias veces a clases anteriores y leer detenidamente los aportes (incluso ver videos externos que algunos incluyeron en sus aportes) pude entenderlo un poco m谩s, pero me molest贸 que no fuera claro en el hilo normal de las clases. Yo creo que es mejor explicar lo que est谩 en esta clase como la base sobre la cual se implementa el patr贸n de Inversi贸n de Control (lo cual hubiera hecho mucho m谩s clara la clase anterior sobre el tema) y despu茅s como se puede hacer de forma diferente por medio de las anotaciones @component, @controller, @cepository y @service. Es una l谩stima que a veces, en funci贸n de hacer cursos pr谩cticos para la gente, se pierda la posibilidad de abordar a profundidad conceptos claves para entender como desarrolladores qu茅 es lo que de verdad hace el c贸digo que escribimos.

Quiz谩 ser铆a m谩s claro si en vez de crear una dependencia de tres clases con nombres totalmente random se hiciera un ejemplo real o al menos con algo de contexto.

Un diagrama previo hubiera sido de ayuda en este video.

Reto completado.

He utilizado un poco de programacion funcional para reforzar lo aprendido del curso de Platzi, usando Streams.

Dependencia principal

  • MyOwnOperation interface:
    public interface MyOwnOperation {
    	List<Integer> generateRandomElements(int maxElement, int maxLimit);
    }
    
  • MyOwnOperationImplement class:
    public class MyOwnOperationImplement implements MyOwnOperation{
    	@Override
    	public List<Integer> generateRandomElements(int maxElement, int maxLimit) {
        	return new Random().ints(0, maxElement)
                	.limit(maxLimit)
                	.boxed()    // Regresa un IntStream
                    .collect(Collectors.toList());
       	}
    }
    

Bean con dependencia

  • MyOwnBeanWithDependency interface:
    public class MyOwnBeanWithDependencyImplement implements MyOwnBeanWithDependency{
    	private MyOwnOperation myOwnOperation;
    
    	public MyOwnBeanWithDependencyImplement(MyOwnOperation myOwnOperation) {
    		this.myOwnOperation = myOwnOperation;
    	}
    	
    	@Override
    	public void displayElements() {
    		System.out.println("Llamamos a MyOwnOperationImplement para generar lista aleatoria");
    		List<Integer> randNums = this.myOwnOperation.generateRandomElements(500, 10);
    		randNums.forEach(System.out::println);
    		System.out.println("Hola desde mi implementacion de un bean con dependencia usando Streams y Listas");
    	}
    

Configuracion

    @Bean
    public MyOwnOperation beanOperationMyOwn() {
        return new MyOwnOperationImplement();
    }

    @Bean
    public MyOwnBeanWithDependency beanOperationMyOwnWithDependency(MyOwnOperation myOwnOperation){
        return new MyOwnBeanWithDependencyImplement(myOwnOperation);
    }

Main

 public FundamentosApplication(@Qualifier("componentTwoImplement") ComponentDependency componentDependency,
                                  MyBean myBean,
                                  MyBeanWithDependency myBeanWithDependency,
                                  MyOwnBeanWithDependency myOwnBeanWithDependency) {
        this.componentDependency = componentDependency;
        this.myBean = myBean;
        this.myBeanWithDependency = myBeanWithDependency;
        this.myOwnBeanWithDependency = myOwnBeanWithDependency;
    }

    public static void main(String[] args) {
        SpringApplication.run(FundamentosApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        this.componentDependency.saludar();
        this.myBean.print();
        this.myBeanWithDependency.printWithDependency();
        this.myOwnBeanWithDependency.displayElements();
    }

En la capa repository creo la clase Persona:

@Repository
public class Persona implements PersonaMethods{

    private int edad=32;
    private String nombre="Mauricio";

    public int getEdad() {
        return edad;
    }

    public void setEdad(int edad) {
        this.edad = edad;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    @Override
    public void saludar() {
        System.out.println("Hola "+getNombre()+" tienes "+getEdad()+" a帽os cumplidos.");
    }
}

Al mismo nivel la interface PersonaMethods:

public interface PersonaMethods {

    void saludar();

}


En 鈥淔undamentosAplication鈥 a帽ado la l铆nea en la parte superior:

private Persona persona;

El constructor queda as铆:

public FundamentosApplication(@Qualifier("componentTwoImplement")ComponentDependency componentDependency, MyBean myBean, MyBeanWithDependency myBeanWithDependency, Persona persona){
		this.componentDependency=componentDependency;
		this.myBean=myBean;
		this.myBeanWithDependency=myBeanWithDependency;
		this.persona=persona;
	}

Y el m茅todo run:

@Override
	public void run(String... args) throws Exception {
		componentDependency.saludar();
		myBean.print();
		myBeanWithDependency.printwithdependency();
		persona.saludar();
	}

El log del run arroja lo anterior realizado en el curso y:

鈥淗ola Mauricio tienes 32 a帽os cumplidos.鈥

MiConfigureichonBin! 馃お

Ser铆a de mucho provecho, antes de codificar los ejemplos, hacer uso de diagramas UML, para ver de una forma sencilla, c贸mo interact煤an las clases, interfaces y dem谩s. De resto, buen video 馃憣.

Creo que seria mucho mejor agregar un ejemplo mas realista que nombres tan poco recordables como MyBeanWithDependency

Este curso le faltan algunos detalles, los ejemplos deber铆an ser casos reales, los nombres de los archivos son muy random y si fuera algo real se asimilaria mejor la aplicaci贸n

En windows o linux Ubuntu Para sobreescribir m茅todos de forma mas r谩pida (te ser谩 muy util cuando tengas que implementar varios m茅todos) lleva el cursor a la l铆nea donde se muestre el subrallado rojo indicando error, enseguida usa la combinaci贸n de teclas Alt + Enter, se mostrar谩 un recuadro y presionas la opci贸n 鈥業mplement methods鈥, se mostrar谩 otro recuadro con todos los m茅todos de la interfaz que implementaste, selecciona los m茅todos y presiona OK o Enter.


Reto Completado!!

package com.fundamentosplatzi.springboot.fundamentos.bean;

public interface MyMatrixOperations {
    Integer[][] matrixMultiplication(Integer[][] matrix1, Integer[][] matrix2) throws Exception;
    Integer[][] randomMatrixGenerator(Integer rows, Integer columns, Integer topNumber, Integer LoweNumber);
    Integer[] getColumn(Integer columnNumber,Integer[][] matrix);
    void printMatrix(Integer[][] matrix);
}
package com.fundamentosplatzi.springboot.fundamentos.bean;

public interface MyVectorOperations {
    Integer dotProduct(Integer[] vector1, Integer[] vector2) throws  Exception;
}
package com.fundamentosplatzi.springboot.fundamentos.bean;

import org.springframework.beans.factory.annotation.Autowired;

public class MyMatrixOperationsImplement implements  MyMatrixOperations{

    MyVectorOperations myVectorOperations;

    @Autowired
    public MyMatrixOperationsImplement(MyVectorOperations myVectorOperations) {
        this.myVectorOperations = myVectorOperations;
    }

    @Override
    public Integer[][] matrixMultiplication(Integer[][] matrix1, Integer[][] matrix2) throws Exception {
        if (matrix1[0].length == matrix2.length){
            Integer[][] result = new Integer[matrix1.length][matrix2[0].length];
            for (int i = 0; i < matrix1.length; i++){
                Integer[] row = matrix1[i];
                for (int j = 0; j < matrix2[0].length; j++) {
                    Integer[] column = getColumn(j, matrix2);
                    result[i][j] = myVectorOperations.dotProduct(row, column);
                }
            }
            return result;
        }
        else{
            throw  new Exception("It is not possible to multiply, the number of columns of matrix 1 is different from the number of rows of matrix 2.");
        }
    }

    @Override
    public Integer[][] randomMatrixGenerator(Integer rows, Integer columns, Integer topNumber, Integer lowerNumber) {
        //System.out.println("Rows -> " + rows);
        //System.out.println("Columns -> " + columns);
         Integer[][] randomMatrix = new Integer[rows][columns];
         for (int i = 0; i < rows; i++){
             //System.out.println("   i -> " + i);
             for (int j = 0; j < columns; j++){
                 //System.out.println("       j -> " + j);
                 double randomDouble = Math.random();
                 Integer randomInteger = (int) (lowerNumber + Math.floor(randomDouble*(topNumber - lowerNumber + 1)));
                 randomMatrix[i][j] = randomInteger;
             }
         }
         return randomMatrix;
    }

    @Override
    public Integer[] getColumn(Integer columnNumber, Integer[][] matrix) {
        Integer[] column = new Integer[matrix.length];
        for (int i = 0; i < matrix.length; i++) {
            column[i] = matrix[i][columnNumber];
        }
        return column;
    }

    @Override
    public void printMatrix(Integer[][] matrix) {
        for (int j = 0; j < matrix.length; j++){
            Integer[] row = matrix[j];
            System.out.print("|");
            for (int i = 0; i < row.length; i++){
                System.out.print(row[i]);
                if ((row.length - i) == 1){
                    System.out.print("|\n");
                }
                else{
                    System.out.print(" ");
                }
            }
        }
        System.out.print("\n");
    }
}
<package com.fundamentosplatzi.springboot.fundamentos.bean;

public class MyVectorOperationsImplement implements MyVectorOperations{
    @Override
    public Integer dotProduct(Integer[] vector1, Integer[] vector2) throws Exception{
        if(vector1.length == vector2.length){
            Integer result = 0;
            for (int i = 0; i < vector1.length; i++){
                result += vector1[i]*vector2[i];
            }
            return result;
        }
        else{
            throw  new Exception("There cannot be a dot product between two vectors of different sizes.");
        }
    }
}> 

Me gusto como se inyecta dependencias dentro de otras dependencias

Esto ahorra mucho c贸digo!, esto de los beans y la inyecci贸n de las dependencias est谩 nice.

Reto cumplido

nota importante para que funcione el paquete configuration, las clases impl van sin anotaci贸n

//Inyectando la dependencia Yema en Clara.
//----------------------------------------

//En package "bean"
	//Creamos la interfaz "Yema"
public interface Yema {
    int numberOfChikens();
}

	//Creamos la clase que lo implmenenta, "YemaImplement".
public class YemaImplements implements Yema{

    @Override
    public int numberOfChikens() {
        return 2;
    }
}

	//Creamos la interface "Clarar"
public interface Clara {

    void print();
}

	//Creamos la class que lo implementa, "ClaraImplemente"
public class ClaraImplement implements Clara{
    Yema yema;
    public ClaraImplement(Yema yema) {
        this.yema = yema;
    }
    @Override
    public void print() {
        yema.numberOfChikens();
        System.out.println("Contengo " + yema.numberOfChikens() + " pollitos :3");
    }
}

//En package Configuration
	//En la clase MyConfiguration agregamos.
		@Bean
    public Yema beanOperationYema() {
        return new YemaImplements();
    }

    @Bean
    public Clara beanOperationClara(Yema yema) {
        return new ClaraImplement(yema);
    }

//En la clase donde se encuentra el main (). Solo inyectamos la dependenia clara, lo pasamos por el constructor y ejecutamos su m茅todo print().

//Respuesta de consola: Contengo 2 pollitos :3

Reto:

  1. defino la interfaz IMyBeanChallenge que tendr谩 dos m茅todos, una funci贸n que devuelve una cadena y un procedimiento que imprime una lista de n煤mero hasta llegar a un tope.
public interface IMyBeanChallenge {
    void imprimeNumerosHasta();
    String queSoy();
}
  1. defino la interfaz IMyBeanChallengeGiveANumber para capturar un n煤mero aleatorio:
public interface IMyBeanChallengeGiveANumber {
    int aNumber(int n);
}
  1. implemento la obtenci贸n del n煤mero aleatorio:
public class MyBeanChallengeGiveANumberImplement implements IMyBeanChallengeGiveANumber{
    @Override
    public int aNumber(int n) {
        return (int) (Math.random()*n);
    }
}
  1. implemento la interfaz en la clase MyBeanChallengeImplement inyectando la obtenci贸n de n煤meros aleatoria:
public class MyBeanChallengeImplement implements IMyBeanChallenge{

    private int number = 0;
    private int tope = 0;

    private IMyBeanChallengeGiveANumber iMyBeanChallengeGiveANumber;
    @Autowired
    public MyBeanChallengeImplement(IMyBeanChallengeGiveANumber iMyBeanChallengeGiveANumber) {
        this.iMyBeanChallengeGiveANumber = iMyBeanChallengeGiveANumber;
        this.tope = 15;
        setNumber(this.tope);
    }

    public void setNumber(int t){
        this.number = iMyBeanChallengeGiveANumber.aNumber(t);
    }

    public int getNumber(){
        return this.number;
    }

    @Override
    public void imprimeNumerosHasta() {
        for(int i = 1; i <= this.getNumber(); i++){
            System.out.println(i);
        }
    }

    @Override
    public String queSoy() {
        return "Soy la implementaci贸n que imprime n煤meros hasta " + this.getNumber() + " inyectado aleatoriamente.";
    }
}
  1. implemento la configuraci贸n de los bean creados:
@Configuration
public class MyBeanConfiguration {

    @Bean
    public IMyBeanChallengeGiveANumber beanChallengeGiveANumber(){
        return new MyBeanChallengeGiveANumberImplement();
    }

    @Bean
    public IMyBeanChallenge beanChallenge(IMyBeanChallengeGiveANumber iMyBeanChallengeGiveANumber){
        return new MyBeanChallengeImplement(iMyBeanChallengeGiveANumber);
    }
}
  1. implemento la clase principal de la aplicaci贸n inyectando la implementaci贸n que muestra un listado de n煤mero hasta el tope aleatorio:
@SpringBootApplication
public class MiBeanChallengeApplication implements CommandLineRunner {

    private IMyBeanChallenge iMyBeanChallenge;
    @Autowired
    public MiBeanChallengeApplication(IMyBeanChallenge iMyBeanChallenge) {
        this.iMyBeanChallenge = iMyBeanChallenge;
    }

    public static void main(String[] args) {
        SpringApplication.run(MiBeanChallengeApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        System.out.println(iMyBeanChallenge.queSoy());
        iMyBeanChallenge.imprimeNumerosHasta();
    }
}

Respuesta:

:: Spring Boot ::                (v2.6.7)
Soy la implementaci贸n que imprime n煤meros hasta 14 inyectado aleatoriamente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Esta clase me dejo con dolores de cabeza 馃樀鈥嶐煉, muy loco todo, pero se va entendiendo poco a poco.

Me cost贸 mucho entender desde un inicio, he repetido m谩s de 7 veces este video, al final si he comprendido pero requiere pausar y entender la l贸gica. Soy una persona muy visual y como consejo, ayuda mucho plantearlo visualmente y tener claro lo que hace cada clase. No hay que desanimarse si se puede !

Mi reto lo resolv铆 creando dos beans

  • CartelesBean interfaz con un m茅todo imprimirMensajeDecorado() que imprim茅 un mensaje en pantalla. La clase que implementa la interfaz, usa la dependencia DecoradorStringBean en la implementaci贸n del m茅todo. Esta dependencia se le pasa por par谩metro en el constructor.
public interface CartelesBean {

    public void imprimirMensajeDecorado(String mensaje);
}

public class CartelesImpl implements CartelesBean {
    private DecorarStringBean decorarStringBean;

    public CartelesImpl(DecorarStringBean decorarStringBean) {
        this.decorarStringBean = decorarStringBean;
    }


    @Override
    public void imprimirMensajeDecorado(String mensaje) {
        System.out.println(this.decorarStringBean.decorar(mensaje));
    }
}

  • DecoradorStringBean interfaz con un m茅todo decorar(String texto). La implementaci贸n del m茅todo retorna el string concatenado con otras cadenas.
public interface DecorarStringBean {
    String decoracion = "-_-_-_- #";
    public String decorar(String texto);
}

public class DecorarStringImpl implements DecorarStringBean {
    @Override
    public String decorar(String texto) {
        return this.decoracion + texto + this.decoracion;
    }
}

En la configuraci贸n est谩 estos m茅todos


@Configuration
public class BeansConfiguration {
    @Bean
    public DecorarStringBean decorarStringBean() {
        return new DecorarStringImpl();
    }

    @Bean
    public CartelesBean cartelesBean(DecorarStringBean decorarStringBean) {
        return new CartelesImpl(decorarStringBean);
    }

}

Finalmente en la clase Application us茅 la dependencia CartelesBean

@SpringBootApplication
public class Application implements CommandLineRunner {

    private CartelesBean cartelesBean;


    public Application(CartelesBean cartelesBean) {
        this.cartelesBean = cartelesBean;
    }


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        cartelesBean.imprimirMensajeDecorado("Este mensaje se modifica con una dependencia");
    }
}

Aqu铆 se observa lo que se imprime por consola

  • _ - _ - _ - #Este mensaje se modifica con una dependencia- _ - _ - _ - #
    Process finished with exit code 0

Reto cumplido!!

Reto completado.
Ha sido uno sencillito, quiero imprimir el objeto persona de la clase MyPersonaImplement con sus atributos, nombre apellido y edad, esta edad se calcula a traves de un metodo llamado calcularEdad, que recibe un date y hace una serie de operaciones para calcular la edad. En la clase MyOperationSaludarWithDependency uso la interfaz MyPersona y a traves de los metodos puestos recojo los valores del nombre, apellido y el metodo para calcular la edad. Bueno, dejo el codigo.

Interfaz myPersona

public interface MyPersona {
    String getNombre();
    String getApellido();
    int getEdad();
    void setEdad(int edad);
    int calcularEdad();
}

Clase MyPersonaImplement que implementa la interfaz

public class MyPersonaImplement implements MyPersona{
    private String nombre = "Juan";
    private String apellido = "Perez";
    private Date fechanac = new Date(0);
    private int edad;

    @Override
    public String getNombre() {
        return nombre;
    }
    @Override
    public String getApellido() {
        return apellido;
    }
    @Override
    public int getEdad() {
        return edad;
    }
    @Override
    public void setEdad(int edad) {
        this.edad = edad;
    }
    @Override
    public int calcularEdad() {
        GregorianCalendar gcNac = new GregorianCalendar();
        gcNac.setTime(fechanac);
        GregorianCalendar ahora = new GregorianCalendar();
        int anios = ahora.get(Calendar.YEAR)-gcNac.get(Calendar.YEAR);
        if(gcNac.get(Calendar.DAY_OF_YEAR)>ahora.get(Calendar.DAY_OF_YEAR))
            anios--;
        return anios;
    }
}

Interfaz MyOperationSaludarWithDependency

public interface MyOperationSaludarWithDependency {
    void saludar();
}

Y el objeto MyOperationSaludarWithDependencyImplement que tiene la dependencia de la interfaz MyPersona

public class MyOperationSaludarWithDependencyImplement implements MyOperationSaludarWithDependency {
    private MyPersona myPersona;

    public MyOperationSaludarWithDependencyImplement(MyPersona myPersona) {
        this.myPersona = myPersona;
    }
    @Override
    public void saludar() {
        myPersona.setEdad(myPersona.calcularEdad());
        System.out.println("Hola, me llamo "+myPersona.getNombre()+" "+myPersona.getApellido()+", y tengo "+myPersona.getEdad()+" anyos");
    }

La clase MyConfigurationBean

@Configuration
public class MyConfigurationBean {
@Bean 
MyPersona myPersonaOperation(){
        return new MyPersonaImplement();
    }
    @Bean
    public MyOperationSaludarWithDependency beanOperationSaludarWithDependency(MyPersona myPersona){
        return new MyOperationSaludarWithDependencyImplement(myPersona);
    }
}

Y por ultimo la clase FundamentosAplikeichon jaajaja

@SpringBootApplication
public class FundamentosApplication implements CommandLineRunner {
	private MyOperationSaludarWithDependency myOperationSaludarWithDependency;
public FundamentosApplication(@Qualifier("componentImplement") MyOperationSaludarWithDependency myOperationSaludarWithDependency) {
this.myOperationSaludarWithDependency = myOperationSaludarWithDependency;
	}
	public static void main(String[] args) {
		SpringApplication.run(FundamentosApplication.class, args);
	}
@Override
	public void run(String... args) {
	myOperationSaludarWithDependency.saludar();
	}
}

Es uno sencillito por si alguien quisiera usarlo. Un saludo y nunca pareis de aprender.

Bien !! Reto hecho y avanzando

https://bit.ly/3ujILxM

reto Cumplido!

Reto cumplido 馃槃
Reto 01

En mi caso hice unas pruebas, cuando la implementacion de las dependencias se hacen desde un implement con @Component se puede inyectar por constructor o con la Anotacion @Autowired. Pero cuando se hacen por medio de configuracion de @Bean me generar error al utilizar el @Autowired, me obliga a inyectarlas por constructor鈥 Interesenta clase de como inyectar dependencias鈥

Est谩n incompletos los archivos de la clase

Reto cumplido!