J'utilise Dependency Injection au printemps depuis un certain temps maintenant, et je comprends comment cela fonctionne et quels sont les avantages et les inconvénients de son utilisation. Cependant, lorsque je crée une nouvelle classe, je me demande souvent - Cette classe doit-elle être gérée par Spring IOC Container?
Et je ne veux pas parler des différences entre l'annotation @Autowired, la configuration XML, l'injection de setter, l'injection de constructeur, etc. Ma question est générale.
Disons que nous avons un service avec un convertisseur:
@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
}
}
De toute évidence, le convertisseur n'a aucune dépendance, il n'est donc pas nécessaire qu'il soit câblé automatiquement. Mais pour moi, cela semble mieux que auto-câblé. Le code est plus propre et facile à tester. Si j'écris ce code sans DI, le service ressemblera à ça:
@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);
}
}
Maintenant, il est beaucoup plus difficile de le tester. De plus, un nouveau convertisseur sera créé pour chaque opération de conversion, même s'il est toujours dans le même état, ce qui semble être une surcharge.
Il existe des modèles bien connus dans Spring MVC: contrôleurs utilisant des services et services utilisant des référentiels. Ensuite, si le référentiel est câblé automatiquement (ce qui est généralement le cas), le service doit également être câblé automatiquement. Et c'est assez clair. Mais quand utilisons-nous l'annotation @Component? Si vous avez des classes utilitaires statiques (comme les convertisseurs, les mappeurs) - les attribuez-vous automatiquement?
Essayez-vous de rendre toutes les classes câblées automatiquement? Ensuite, toutes les dépendances de classe sont faciles à injecter (encore une fois, faciles à comprendre et faciles à tester). Ou essayez-vous de câbler automatiquement uniquement lorsque cela est absolument nécessaire?
J'ai passé un certain temps à chercher des règles générales sur le moment d'utiliser le câblage automatique, mais je n'ai trouvé aucun conseil spécifique. Habituellement, les gens parlent de "utilisez-vous DI? (Oui / non)" ou "quel type d'injection de dépendance préférez-vous", ce qui ne répond pas à ma question.
Je serais reconnaissant pour tout conseil concernant ce sujet!