Leí en algunas publicaciones sobre Spring MVC y Portlets que no se recomienda la inyección de campo . Según tengo entendido, la inyección de campo es cuando se inyecta un Bean @Autowired
así:
@Component
public class MyComponent {
@Autowired
private Cart cart;
}
Durante mi investigación también leí sobre la inyección de constructores :
@Component
public class MyComponent {
private final Cart cart;
@Autowired
public MyComponent(Cart cart){
this.cart = cart;
}
}
¿Cuáles son las ventajas y las desventajas de ambos tipos de inyecciones?
EDITAR 1: Como esta pregunta está marcada como un duplicado de esta pregunta, la revisé. Porque no hay ejemplos de código ni en la pregunta ni en las respuestas, no me queda claro si estoy en lo cierto con mi suposición de qué tipo de inyección estoy usando.
Date(int,int,int)
existe.Respuestas:
Tipos de inyecciones
Hay tres opciones para inyectar dependencias en un bean:
Está utilizando la opción 3. Eso es lo que sucede cuando utiliza
@Autowired
directamente en su campo.Pautas de inyección
Una pauta general recomendada por Spring (consulte las secciones sobre DI basada en Constructor o DI basada en Setter ) es la siguiente:
Inconvenientes de la inyección de campo
Las razones por las que la inyección de campo está mal vista son las siguientes:
Conclusión
Dependiendo de sus necesidades, debe usar principalmente inyección de constructor o alguna combinación de inyección de constructor y setter. La inyección de campo tiene muchos inconvenientes y debe evitarse. La única ventaja de la inyección de campo es que es más conveniente escribir, lo que no supera todas las desventajas.
Otras lecturas
Escribí un artículo de blog sobre por qué la inyección de campo generalmente no se recomienda: Inyección de dependencia de campo considerada dañina .
fuente
Esta es una de las discusiones interminables en el desarrollo de software, pero las principales personas influyentes en la industria se están volviendo más obstinadas sobre el tema y comenzaron a sugerir la inyección de constructores como la mejor opción.
Inyección de constructor
Pros:
Contras:
Básicamente, la inyección de campo es lo contrario.
fuente
Cuestion de gusto. Es tu decisión.
Pero puedo explicar por qué nunca uso la inyección del constructor .
No quiero poner en práctica un constructor para todos mis
@Service
,@Repository
y@Controller
frijoles. Quiero decir, hay alrededor de 40-50 frijoles o más. Cada vez que agrego un nuevo campo, tendría que extender el constructor. No. No lo quiero y no tengo que hacerlo.¿Qué pasa si su Bean (Servicio o Controlador) requiere que se inyecten muchos otros granos? Un constructor con 4+ parámetros es muy feo.
Si estoy usando CDI, el constructor no me concierne.
EDITAR # 1 : Vojtech Ruzicka dijo:
Si. Teoría y realidad. Aquí hay un ejemplo:
DashboardController
mapeado a una ruta única*:8080/dashboard
.My
DashboardController
recopila mucha información de otros servicios para mostrarla en una página de descripción general del panel / sistema. Necesito este único controlador. Así que tengo que asegurar solo esta ruta (autenticación básica o filtro de rol de usuario).EDICIÓN # 2 : Dado que todos están enfocados en los 8 parámetros en el constructor ... Este fue un ejemplo del mundo real: un código heredado de un cliente. He cambiado eso. La misma argumentación se aplica a mí para más de 4 parámetros.
Se trata de inyección de código, no de construcción de instancias.
fuente
Un comentario más: Vojtech Ruzicka declaró que Spring inyecta frijoles de tres maneras (la respuesta con la mayor cantidad de puntos):
Esta respuesta es INCORRECTA, porque PARA CADA TIPO DE INYECCIÓN, EL RESORTE UTILIZA REFLEXIÓN. Use IDE, establezca un punto de interrupción en el setter / constructor y verifique.
Esto puede ser una cuestión de gustos pero también puede ser una cuestión de CASO. @dieter proporcionó un caso excelente cuando la inyección de campo es mejor. Si está utilizando la inyección de campo en las pruebas de integración que están configurando el contexto de Spring, el argumento con la capacidad de prueba de la clase también es inválido, a menos que desee escribir más adelante en las pruebas de Sus pruebas de integración;)
fuente