Da tempo utilizzo Dependency Injection in primavera, e capisco come funziona e quali sono alcuni pro e contro del suo utilizzo. Tuttavia, quando sto creando una nuova classe, mi chiedo spesso: questa classe dovrebbe essere gestita da Spring IOC Container?
E non voglio parlare di differenze tra annotazione @Autowired, configurazione XML, iniezione setter, iniezione costruttore, ecc. La mia domanda è generale.
Supponiamo di avere un servizio con un convertitore:
@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
}
}
Chiaramente, il convertitore non ha alcuna dipendenza, quindi non è necessario per essere autowired. Ma per me sembra meglio autowired. Il codice è più pulito e facile da testare. Se scrivo questo codice senza DI, il servizio sarà simile a questo:
@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);
}
}
Ora è molto più difficile testarlo. Inoltre, verrà creato un nuovo convertitore per ogni operazione di conversione, anche se è sempre nello stesso stato, che sembra un sovraccarico.
Ci sono alcuni modelli ben noti in Spring MVC: controllori che utilizzano servizi e servizi che utilizzano i repository. Quindi, se il repository è autowired (che di solito è), anche il servizio deve essere autowired. E questo è abbastanza chiaro. Ma quando usiamo l'annotazione @Component? Se hai alcune classi di utilizzo statiche (come convertitori, mapper), le autowire?
Cerchi di rendere tutte le classi autowired? Quindi tutte le dipendenze di classe sono facili da iniettare (ancora una volta, facili da capire e facili da testare). O cerchi di autowire solo quando è assolutamente necessario?
Ho trascorso un po 'di tempo a cercare alcune regole generali su quando utilizzare l'autowiring, ma non sono riuscito a trovare suggerimenti specifici. Di solito, la gente parla di "usi DI? (Sì / no)" o "che tipo di dipendenza da iniezione preferisci", che non risponde alla mia domanda.
Sarei grato per eventuali suggerimenti su questo argomento!