Ich verwende Dependency Injection seit einiger Zeit im Frühjahr und verstehe, wie es funktioniert und welche Vor- und Nachteile es mit sich bringt. Wenn ich jedoch eine neue Klasse erstelle, frage ich mich oft: Soll diese Klasse von Spring IOC Container verwaltet werden?
Und ich möchte nicht über Unterschiede zwischen @Autowired-Annotation, XML-Konfiguration, Setter-Injection, Konstruktor-Injection usw. sprechen. Meine Frage ist eine allgemeine.
Nehmen wir an, wir haben einen Service mit einem Konverter:
@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
}
}
Es ist klar, dass der Konverter keine Abhängigkeiten aufweist und daher nicht automatisch verdrahtet werden muss. Aber für mich scheint es besser als autowired. Code ist sauberer und einfach zu testen. Wenn ich diesen Code ohne DI schreibe, sieht der Dienst folgendermaßen aus:
@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);
}
}
Jetzt ist es viel schwieriger, es zu testen. Außerdem wird für jeden Konvertierungsvorgang ein neuer Konvertierer erstellt, obwohl er sich immer im selben Zustand befindet, was wie ein Overhead erscheint.
In Spring MVC gibt es einige bekannte Muster: Controller, die Dienste verwenden, und Dienste, die Repositorys verwenden. Wenn das Repository automatisch verkabelt wird (was normalerweise der Fall ist), muss auch der Service automatisch verkabelt werden. Und das ist ganz klar. Aber wann verwenden wir die @Component-Annotation? Wenn Sie statische Util-Klassen haben (wie Konverter, Mapper) - führen Sie eine automatische Verdrahtung durch?
Versuchen Sie, alle Klassen automatisch zu verkabeln? Dann sind alle Klassenabhängigkeiten leicht zu injizieren (wiederum leicht zu verstehen und leicht zu testen). Oder versuchen Sie, nur dann automatisch zu verdrahten, wenn dies unbedingt erforderlich ist?
Ich habe einige Zeit damit verbracht, nach allgemeinen Regeln für die Verwendung von Autowiring zu suchen, konnte jedoch keine spezifischen Tipps finden. Normalerweise wird über "Verwenden Sie DI? (Ja / Nein)" oder "Welche Art der Abhängigkeitsinjektion bevorzugen Sie" gesprochen, was meine Frage nicht beantwortet.
Für Tipps zu diesem Thema wäre ich dankbar!