¿Qué es la inyección de dependencia? - Sepa cómo implementar la inyección de dependencia



Este artículo sobre ¿Qué es la inyección de dependencia? Es una guía completa para la inyección de dependencia con una práctica en Spring Boot.

En un mundo en el que trabajamos con lenguajes de programación día a día, todos tendemos a buscar métodos y trucos para hacernos la vida más fácil. Bueno, Dependency Injection es una de esas técnicas que tiene como objetivo ayudar al código del desarrollador fácilmente proporcionando dependencias de otro objeto. En este artículo sobre Qué es la inyección de dependencia, lo ayudaré a comprender esta técnica en detalle.

Los siguientes temas se tratarán en este artículo:





Entonces, comencemos con este artículo.

¿Qué es la inyección de dependencia?

La inyección de dependencia es la capacidad de un objeto para suministrar dependencias de otro objeto.



Ahora, estoy bastante seguro, es posible que no haya entendido nada con la definición técnica anterior. Entonces, déjame aclararte la confusión.

Cuando escuchas el término dependencia, ¿qué te viene a la mente?

Obviamente, algo que depende de otra cosa como apoyo, ¿verdad?



Bueno, eso es lo mismo, en el caso de la programación también.

La dependencia en la programación es un enfoque en el que una clase usa funcionalidades específicas de otra clase. Entonces, por ejemplo, si considera dos clases A y B, y dice que la clase A usa funcionalidades de la clase B, entonces está implícito que la clase A tiene una dependencia de la clase B. Ahora, si está codificando en Java, entonces debe saber eso, tienes queCree una instancia de la clase B antes de que los objetos sean utilizados por la clase A.

Tipos de clases - ¿Qué es la inyección de dependencia? - Edureka

Entonces, si ahora tengo que definir Inyección de dependencia para usted, entonces el proceso de crear un objeto para alguna otra clase y dejar que la clase use directamente la dependencia se llama Inyección de dependencia. Tiene principalmente tres clases involucradas:

  • Clase de cliente: Esta es la clase dependiente y depende de la clase de servicio.

  • Clase de servicio: Esta clase proporciona un servicio a la clase cliente.

  • Clase de inyector: Esta clase es responsable de inyectar el objeto de clase de servicio en la clase de cliente.

Ahora que ha entendido qué es la inyección de dependencia, permítame que le enseñe el principio en el que se basa la inyección de dependencia.

Inversión de control

Como mencioné anteriormente, la Inversión de Control es un principio basado en el cual se realiza la Inyección de Dependencia. Además, como sugiere el nombre, Inversión de control se usa básicamente para invertir diferentes tipos de responsabilidades adicionales de una clase en lugar de la responsabilidad principal.

Si tengo que explicarte en términos más simples, considera un ejemplo en el que tienes la capacidad de cocinar. De acuerdo con el principio de IoC, puede invertir el control, por lo que en lugar de cocinar alimentos, puede ordenar directamente desde el exterior, donde recibe los alimentos en la puerta de su casa. Por lo tanto, el proceso de entrega de alimentos en la puerta de su casa se llama Inversión de Control.

No tiene que cocinar usted mismo, en cambio, puede pedir la comida y dejar que un ejecutivo de entrega le entregue la comida. De esta manera, no tiene que ocuparse de las responsabilidades adicionales y solo concentrarse en el trabajo principal.

Ahora que conoce el principio detrás de la inyección de dependencia, permítame explicarle los tipos de inyección de dependencia.

Tipos de inyección de dependencia

Existen principalmente tres tipos de inyección de dependencia:

  • Inyección de constructor: En este tipo de inyección, el inyector proporciona dependencia a través del constructor de la clase de cliente.

  • Inyección de Setter / Inyección de propiedades: En este tipo de inyección, el método inyector inyecta la dependencia al método setter expuesto por el cliente.

  • Inyección de interfaz: En este tipo de inyección, el inyector usa Interface para proporcionar dependencia a la clase de cliente. Los clientes deben implementar una interfaz que exponga unmétodo settercualacepta la dependencia.

Hasta ahora, espero que hayas entendido el hecho de que Dependency Injection es responsable de crear objetos, entender qué clases requieren esos objetos y finalmente proporcionar esos objetos a esas clases. Entonces, en esa nota, veamos a continuación los beneficios de la inyección de dependencia.

tutoriales de ms sql para principiantes

Beneficios de la inyección de dependencia

Antes de enumerar los beneficios de la inyección de dependencia, permítame explicarle la necesidad de esta inyección a nivel industrial, para ayudarlo a comprender mejor los beneficios.

Considere un escenario, en el que tiene una Clase de correo electrónico, cuya única responsabilidad es cuidar los correos electrónicos recibidos. Ahora, esta clase tendrá objetos como 'A la dirección de correo electrónico', 'De la dirección de correo electrónico', 'Asunto y el cuerpo del correo electrónico'.

Ahora bien, si la empresa quiere guardar mensajes de texto y audio, ¿cree que esta clase puede guardar el mensaje?

¿Bueno, la respuesta es no?

Eso es porque la clase de correo electrónico no puede manejar los parámetros del texto y los mensajes de audio. En tales casos, tendrá que volver a crear la clase. Ahora, recrear la clase es un trabajo bastante engorroso, especialmente si tienes que hacerlo con regularidad. En cambio, si usa la inyección de dependencia, puede cambiar los objetos en tiempo de ejecución. Por lo tanto, de esta manera, no es necesario que vuelva a crear la clase, lo que le ayuda de muchas maneras.

herencia múltiple en java con ejemplo

Entonces, si tengo que resumir los beneficios de la inyección de dependencia, los siguientes son los beneficios:

Muy bien, ahora que conoce los beneficios de la inyección de dependencia, avancemos y veamos cómo implementar la inyección de dependencia con Spring Boot.

¿Cómo implementar DI usando Spring Boot?

Paso 1: Abre tu Eclipse IDE y crea un Aplicación Spring Boot haciendo clic derecho y eligiendo Proyecto Spring Starter . Luego mencione el nombre del proyecto y haga clic en Terminar .

Para obtener el proyecto Spring Starter, debe instalar Spring Tool Suite desde Eclipse Marketplace. En caso de que no tenga Spring Too Suite instalado, puede consultar mi artículo sobre .

Verá automáticamente que se crea un archivo de aplicación como se muestra a continuación.

Paso 2: A continuación, cree una clase en el mismo paquete. Para hacer eso, haga clic derecho en el archivo -> elija Clase y mencionar el nombre de la clase. Luego haga clic en Terminar . Esto creará un Clase archivo. Aquí he creado una clase de Clientes. Consulte a continuación.

Paso 3: Después de eso, pongamos algunas propiedades para la clase. Entonces, digamos, incluimos ID de cliente, nombre del cliente y Nombre del curso. Mencione el código a continuación.

package com.example.demo // nombre del paquete public class Clientes {private int custid private String custname private String coursename}

Paso 3.1: Una vez que haya terminado con eso, debe generar métodos Getter y Setter para estas propiedades. Para hacer eso, seleccione estas propiedades y haga clic derecho. Entonces escoge Fuente -> Genere métodos Getter y Setter.

Su código hasta ahora debería ser el siguiente:

paquete com.example.demo public class Clientes {private int custid private String custname private String coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String nombre de cliente) {this.custname = custname} public String getCoursename () {return nombre de curso} public void setCoursename (String nombre de curso) {this.coursename = curso de carrera}}

Ahora, considere un escenario en el que tiene que crear un objeto para Clientes y no desea hacerlo manualmente. En tal escenario, tendrá que usar Dependency Injection, para obtener los objetos cuando lo necesite.

Entonces, veamos a continuación cómo podemos lograr lo mismo.

Etapa 4: Primero, cambie el línea de correr en el archivo de clase de aplicación a lo siguiente:

ConfigurableApplicationContext context = SpringApplication.run (DemoApplication.class, args)

Nota: Si recibe un error, importe lo siguiente:

importar org.springframework.boot.SpringApplication importar org.springframework.boot.autoconfigure.SpringBootApplication importar org.springframework.context.ConfigurableApplicationContext

Esta línea de código anterior devolverá un objeto en el momento de la ejecución. Ahora agregue el siguiente código en el archivo de la aplicación.

clientes c = context.getBean (clientes.class)

La línea anterior le dirá al compilador que devuelva un objeto de la clase de cliente. Consulte a continuación.

Paso 4.1: Ahora, para comprobar si funciona o no, puede volver a la clase de cliente y agregue un método de la siguiente manera:

public void display () {System.out.println ('Objeto devuelto correctamente')}

Este método mostrará una salida 'Objeto devuelto con éxito' en la ejecución exitosa.

Paso 4.2: A continuación, debe volver al archivo de la aplicación y mencionar lo siguiente:

c.display ()

A través de esto, está llamando al objeto de la clase Clientes con una referencia del método de visualización. Consulte la siguiente imagen para ver el código de la clase de aplicación hasta ahora:

Ahora, si ejecuta el proyecto, verá un excepción de No hay frijol calificado de tipo . Esto se debe a que la clase de cliente que ha definido no es un Spring Bean, es decir, no es un objeto Spring. Consulte a continuación.

Paso 4.3: Entonces, para decirle al Spring Container eso, necesitamos un objeto de la clase del cliente. Para hacer eso, debe mencionar el @Anotación de componente , en la clase Cliente. El código de la clase Clientes debe ser el siguiente:

paquete com.example.demo import org.springframework.stereotype.Component @Component public class Clientes {private int custid private String custname private String nombre de curso public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname} public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return courseename} public void setCoursename (String courseename) {this.coursename = cursename} public void display () {System.out.println ('Objeto devuelto correctamente')}}

Luego, cuando mencionas a los clientes c = context.getBean (clientes.clase) el compilador comprobará si hay un bean de cliente disponible en el contenedor o no.

Si el Bean está disponible, entonces el marco de Spring está inyectando el objeto de cliente en su aplicación. Entonces, básicamente, este objeto es creado por el marco de Spring, que se puede usar más en la aplicación.

Entonces, si ejecuto este proyecto ahora, verá un resultado que el objeto se devolvió con éxito. Consulte a continuación.

Básicamente, así es como se puede implementar la inyección de dependencia.

Ejemplo: inyección de dependencia mediante anotaciones conectadas automáticamente

Espero que haya entendido cómo funciona Dependency Injection en Spring Boot. Ahora, extendamos este ejemplo y veamos cómo una clase dependiente de la otra clase usó las funcionalidades de esa clase en Spring Boot.

Paso 1: Crear un nuevo archivo de clase , de nuevo haciendo clic derecho en el paquete y el eligiendo Nuevo -> Clase. Ahora, mencione el nombre de la clase como se muestra a continuación y haga clic en Terminar.

Paso 2: A continuación, introduzcamos algunas propiedades para la clase. Entonces, digamos, incluimos TechID, nombre técnico. Mencione el código a continuación.

paquete com.example.demo public class Technologies {private int techid private String techname}

Paso 2.1: Una vez que haya terminado con eso, genere Métodos Getter y Setter para estas propiedades haciendo clic derecho en el archivo y luego elija Fuente -> Generar métodos Getter y Setter.

Paso 3: Ahora, digamos, tenemos que crear un método que imprima ' Exitoso “. Para hacer eso, mencione el código:

public void tech () {System.out.println ('Exitoso')}

Su código hasta ahora debería verse a continuación:

paquete com.example.demo public class Technologies {private int techid private String techname public int getTechid () {return techid} public void setTechid (int techid) {this.techid = techid} public String getTechname () {return techname} public void setTechname (String techname) {this.techname = techname} public void tech () {System.out.println ('Exitoso')}}

Etapa 4: Ahora, para llamar al método tech () en el clase de clientes , tienes que crear un objeto de la clase de tecnologías. Así que mencione la siguiente línea de código en la clase de clientes:

tecnología privada techdetail

Paso 4.1: Una vez que haya terminado con eso, genere Métodos Getter y Setter para estas propiedades por haciendo clic derecho en el archivo y luego elige Fuente -> Generar métodos Getter y Setter.

Paso 5: A continuación, para usar el método tech () , tienes que mencionar techdetail.tech() bajo la método de visualización de la clase de clientes . Además, para asegurarse de que se instancia el objeto techdetail, mencione @Anotación de componente es el Clase de tecnologías. Consulte a continuación.

Ahora, cuando ejecute este proyecto, verá un Excepción de puntero nulo . Esto es porque ahora el La clase de cliente depende de la clase de tecnologías y, sin embargo, no conoce la existencia de la clase de tecnologías. .

jobtracker y tasktracker en hadoop

Entonces, para permitir que el Cliente reconozca la clase de Tecnologías, debe insertar el @Autowired anotación en la clase Clientes. Su código final de la clase de clientes debe ser el siguiente:

paquete com.example.demo import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component @Component public class Clientes {private int custid private String custname private String coursename @Autowired private Technologies techdetail public Technologies getTechdetail ( ) {return techdetail} public void setTechdetail (Technologies techdetail) {this.techdetail = techdetail} public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } public void setCustname (String nombre de cliente) {this.custname = custname} public String getCoursename () {return nombre de curso} public void setCoursename (String nombre de curso) {this.coursename = curso de curso} public void display () {System.out.println ( 'Objeto devuelto correctamente') techdetail.tech ()}}

Una vez que ejecute estos archivos, verá las salidas como Objeto devuelto con éxito y con éxito, lo que implica que nuestra Dependencia de las clases se ha cumplido. Consulte a continuación.

Ahora que ha terminado con el artículo, consulte el por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo.

Tienes una pregunta para nosotros? Por favor, menciónelo en la sección de comentarios de este “¿Qué es la inyección de dependencia? 'Artículo y nos pondremos en contacto contigo lo antes posible.