La inyección de dependencia es un patrón de diseño central del marco Spring.
Primero comprendamos las cosas sin la inyección de dependencia.
Mire a continuación la implementación de un ExportService cuyo trabajo es exportar datos en formato pdf / csv.
- Cómo realizar pruebas de API
- ¿Cuáles son algunas aplicaciones SaaS que desearías que existieran?
- ¿Cómo evitas la abstracción prematura?
- ¿Qué información necesita un probador mientras escribe una prueba unitaria?
- ¿Qué software debo usar para hacer una aplicación?
La clase pública ExportServiceImpl implementa ExportService {
ExportDAO privado exportDao = nuevo ExportDAO ();
@Anular
exportación pública booleana (int exportFormat) {
return exportDao.exportData (exportFormat);
}
}
A primera vista, esta implementación se ve perfecta pero hay algunos problemas con esta implementación:
1) Cada ExportServiceImpl tiene su propia copia de ExportDAO, que es un objeto costoso ya que envuelve una conexión de base de datos. No tiene sentido crear instancias separadas de ExportDAO, si puede compartir una entre múltiples ExportService.
2) ExportServiceImpl está estrechamente relacionado con ExportDAO como su instancia creadora de ExportDAO usando el operador new (). Si cambia el constructor de ExportDAO, este código se romperá. Debido a este acoplamiento, es difícil reemplazar ExportDAO con una mejor implementación.
La Inyección de dependencias es un patrón de diseño en el que la dependencia del objeto (en este caso ExportDAO es una dependencia para el Objeto ExportServiceImpl) se inyecta mediante el marco en lugar de ser creado por el propio Objeto. La inyección de dependencia reduce el acoplamiento entre múltiples objetos, ya que el marco los inyecta dinámicamente. Una de las implementaciones de DI es la Inversión de control (IOC) en cuyo marco, como Spring, controla la dependencia del objeto. Existen principalmente dos tipos de inyección de dependencia: inyección de constructor e inyección de organismo .
En la Inyección del constructor, la dependencia del Objeto se inyecta usando el constructor, mientras que en la Inyección del instalador, la dependencia se proporciona mediante el método de establecimiento.
Ahora veremos cómo la inyección de dependencias resuelve todos los problemas anteriores que hemos enumerado con la implementación anterior de ExportService. Aquí hay una nueva implementación de ExportService con inyección de dependencia de setter.
La clase pública ExportServiceImpl implementa ExportService {
ExportDAO privado ExportDao;
public void setExportDaO (ExportDAO exportDao) {
this.exportDao = exportDao;
}
@Anular
exportación pública booleana (int exportFormat) {
return exportDao.exportData (exportFormat);
}
}
Obtuvimos las siguientes ventajas al usar DI.
1) Reducir el acoplamiento
Tanto la inyección de dependencia del constructor como la del setter reducen el acoplamiento. como en el ejemplo anterior, el acoplamiento entre ExportService y ExportDAO se reduce mediante el uso de la inyección de dependencia.
2) flexibilidad
Gracias a DI, puede reemplazar la implementación de no rendimiento por una mejor luego.