He estado usando Dependency Injection en Spring durante algún tiempo y entiendo cómo funciona y cuáles son algunos de los pros y los contras de usarlo. Sin embargo, cuando estoy creando una nueva clase a menudo me pregunto: ¿Debería esta clase ser administrada por Spring IOC Container?
Y no quiero hablar sobre las diferencias entre la anotación @Autowired, la configuración XML, la inyección de setter, la inyección de constructor, etc. Mi pregunta es general.
Digamos que tenemos un servicio con un convertidor:
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private Converter converter;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
return converter.mapToDto(cars);
}
}
@Component
public class Converter {
public CarDto mapToDto(List<Car> cars) {
return new ArrayList<CarDto>(); // do the mapping here
}
}
Claramente, el convertidor no tiene dependencias, por lo que no es necesario que se conecte automáticamente. Pero para mí parece mejor como autowired. El código es más limpio y fácil de probar. Si escribo este código sin DI, el servicio se verá así:
@Service
public class Service {
@Autowired
private Repository repository;
public List<CarDto> getAllCars() {
List<Car> cars = repository.findAll();
Converter converter = new Converter();
return converter.mapToDto(cars);
}
}
Ahora es mucho más difícil probarlo. Además, se creará un nuevo convertidor para cada operación de conversión, aunque siempre esté en el mismo estado, lo que parece una sobrecarga.
Hay algunos patrones bien conocidos en Spring MVC: Controladores que usan Servicios y Servicios que usan Repositorios. Luego, si el repositorio está conectado automáticamente (que generalmente es), entonces el servicio también debe estar conectado automáticamente. Y esto está bastante claro. ¿Pero cuándo usamos la anotación @Component? Si tiene algunas clases de utilidad estáticas (como convertidores, mapeadores), ¿las conecta automáticamente?
¿Intentas hacer que todas las clases sean autoconectadas? Entonces, todas las dependencias de clase son fáciles de inyectar (una vez más, fácil de entender y fácil de probar). ¿O intenta conectar automáticamente solo cuando es absolutamente necesario?
Pasé algún tiempo buscando algunas reglas generales sobre cuándo usar el cableado automático, pero no pude encontrar ningún consejo específico. Por lo general, la gente habla sobre "¿usa DI? (Sí / no)" o "qué tipo de inyección de dependencia prefiere", que no responde a mi pregunta.
¡Le agradecería cualquier consejo sobre este tema!