Inyección de dependencias y Composición

Hola compañeros

Escribo a ver si me puedes aclarar algo que llevo un buen tiempo sin comprender a pesar que he visto muchos tutoriales, pero ninguno ha resuelto específicamente mi duda. Quizá me extienda demasiado en plantear el problema, pero es para validar los conocimientos de base, que de otra forma me conducirían a otros errores:

Mi duda tiene que ver con la agregación, composición y su codificación utilizando inyección de dependencias.

Según entiendo la agregación es una relación débil, ya que la vida del objeto contenido no depende del objeto contenedor. esto significa que el objeto contenido es pasado por referencia al objeto contenedor. Ej:

        //Constructor
        Public Juguera(Transformador transformador){
                This.miTransformador = transformador; //Paso por referencia
        }

Al pasar el valor por referencia, creamos una especie de vínculo entre el objeto miTransformador y el objeto transformador, si transformador cambia, también se ven reflejados los cambios en el objeto miTransformador, ya que ambos objetos apuntan a la misma referencia.

Por otro lado entiendo que la composición es una relación fuerte, ya que la vida del objeto contenido depende del objeto contenedor, si se destruye el contenedor, también se destruye el objeto contenido. Esto significa que que objeto contenido es pasado "por valor" al objeto contenedor, es decir, se crea una copia del objeto que es independiente al objeto pasado por parámetro. Ej:

        //Constructor
        Public Juguera(Motor motor){
                This.miMotor = new motor();  //Un nuevo objeto
                This.miMotor.setMarca(motor.getMarca());
                This.miMotor.setRevoluciones(motor.getRevoluciones());
        }

Por último, la inyección de dependencias, según tengo entendido, busca desacoplar la clase contenedora de los objetos que necesita para funcionar, desconociendo la forma en que estos objetos se construyen y delegando esta función a otra clase que luego de crearlos, se los pasa por parámetros. Ej:

        Public class JugueraFactory{
               
                public Juguera construyeJuguera(){
                        Juguera miJuguera = new Juguera();
                        Motor miMotor = new Motor();
                        miJuguera.setMotor(miMotor); //Inyección por setter
                        return miJuguera;
                }
        }

En este ejemplo JugueraFactory representa al proveedor. Es una aplicación del patrón de diseño fábrica que hace posible que la clase Juguera no requiera saber cómo obtener un motor por sí misma, sino que es la responsabilidad de JugueraFactory.

Por fin, después de dar la lata (espero no se hayan aburrido), aquí viene mi pregunta. Si la inyección de dependencia pasa los objetos por referencia ¿Esto quiere decir que debo usarla sólo cuando corresponde usar agregación? ¿No me sirve para la composición? ¿O a caso el uso de composición ya no está recomendado?

Agradeceré enormemente sus respuestas y correcciones a lo que considero como aprendido, ya que es impresindible tener una buena base.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

wat

Nunca había visto estas definiciones de composición y agregación... pero sí, conforme a lo que dices, la inyección de dependencias pasa los objetos por referencia (no hay otra manera de pasar objetos en Java).

La composición se recomienda usar en vez de herencia, pero tal vez estoy hablando de otro contexto y es otro tipo de composición y agregación.

De verdad, esto que pusiste de que composición es pasar un objeto y mantener la referencia a él mientras que agregación es crear un objeto y copiar las propiedades de otro, jamás lo había visto. Suena parecido a lo que dicen de crear una colección nueva en vez de pasar referencia a una colección interna, pero eso no es ni composición ni agregación.