Sto usando Dependency Injection in primavera da qualche tempo e capisco come funziona e quali sono alcuni pro e contro del suo utilizzo. Tuttavia, quando creo una nuova classe, mi chiedo spesso: questa classe dovrebbe essere gestita da Spring IOC Container?
E non voglio parlare delle differenze tra annotazione @Autowired, configurazione XML, iniezione setter, iniezione costruttore, ecc. La mia domanda è generale.
Diciamo che abbiamo 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 dipendenze, quindi non è necessario che sia autowired. Ma per me sembra migliore come autowired. Il codice è più pulito e facile da testare. Se scrivo questo codice senza DI, il servizio sarà simile al seguente:
@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.
Esistono alcuni modelli ben noti in Spring MVC: Controller che utilizzano servizi e servizi utilizzando i repository. Quindi, se Repository è autowired (come in genere lo è), anche il servizio deve essere autowired. E questo è abbastanza chiaro. Ma quando utilizziamo l'annotazione @Component? Se disponi di alcune classi util statiche (come convertitori, mapper), le autorizzi?
Cerchi di rendere autowired tutte le classi? Quindi tutte le dipendenze di classe sono facili da iniettare (ancora una volta, facile da capire e facile 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 iniezione di dipendenza preferisci", che non risponde alla mia domanda.
Le sarei grato per eventuali suggerimenti su questo argomento!