Leí en algunos mensajes sobre Spring MVC
y Portlets
que no se recomienda la inyección de campo. Porque estoy tratando de obtener un Así que me pregunté si estoy usando inyección de campo y no puedo responderlo. Como lo entiendo, la inyección de campo es si se inyecta un Bean
en un atributo con @Autowired
como este:
CartController.java:
... @Autowired private Cart cart; ...
BookshopConfiguartion.java:
@Configuration public class BookShopConfiguration { @Bean public Cart cart(){ return new Cart(); } //more configuration
Mi Cart.java
se usa para almacenar y proporcionar información sobre los libros en el carrito.
Durante mi investigación, leí sobre la inyección de constructor :
MyComponent.java:
... public class MyComponent{ private Cart cart; @Autowired public MyComponent(Cart cart){ this.cart = cart; } ...
¿Cuáles son las ventajas y desventajas de ambos tipos de inyecciones?
EDIT 1: Como esta pregunta está marcada como duplicada de esta pregunta, la revisé. Porque no hay ningún ejemplo de código ni en la pregunta ni en las respuestas, no está claro para mí si estoy en lo cierto al adivinar qué tipo de inyección estoy usando.
Tipos de inyección
Hay tres opciones para cómo las dependencias pueden ser inyectadas en un bean:
Está utilizando la opción 3. Eso es lo que sucede cuando usa @Autowired
directamente en su campo.
Directrices de inyección
Una guía general, recomendada por Spring (ver las secciones DI basado en Constructor o DI basado en Setter ) es la siguiente:
Inconvenientes de 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 e instalador. 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 todos los contras.
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 .
Esta es una de las discusiones interminables en el desarrollo de software, pero los principales influenciadores en la industria se están volviendo más obstinados 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 opuesto.
Cuestion de gusto. Es tu decisión.
Pero puedo explicar por qué nunca uso la inyección de constructor .
No quiero implementar un constructor para todos mis @Service
, @Repository
y @Controller
. Quiero decir, hay alrededor de 40-50 frijoles o más. Cada vez que agrego un nuevo campo tendré que extender el constructor. No. No lo quiero y no tengo que hacerlo.
¿Qué sucede si su Bean (Servicio o Controlador) requiere la inyección de muchos otros granos? Un constructor con 8 parámetros es muy feo.
Si uso CDI, el constructor no me concierne.
EDITAR : Vojtech Ruzicka dijo:
la clase tiene demasiadas dependencias y probablemente esté violando el principio de responsabilidad única y debe ser refactorizada
Sí. Teoría y realidad. Aquí hay un ejemplo: DashboardController
mapeado a una sola ruta *:8080/dashboard
.
My DashboardController
recostack una gran cantidad de información de otros servicios para mostrarlos en una página de panel / descripción general del sistema. Necesito este solo controlador. Por lo tanto, debo asegurar solo esta ruta (filtro de función de usuario o autenticación básica).