Saya telah menggunakan Dependency Injection di Spring untuk beberapa waktu sekarang, dan saya mengerti cara kerjanya dan apa saja kelebihan dan kekurangan dari menggunakannya. Namun, ketika saya membuat kelas baru saya sering bertanya-tanya - Haruskah kelas ini dikelola oleh Spring IOC Container?
Dan saya tidak ingin membicarakan perbedaan antara anotasi @Autowired, konfigurasi XML, injeksi setter, injeksi konstruktor, dll. Pertanyaan saya bersifat umum.
Katakanlah kita memiliki Layanan dengan 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
}
}
Jelas, konverter tidak memiliki dependensi, jadi konverter tidak perlu diautow. Tetapi bagi saya tampaknya lebih baik sebagai autowired. Kode lebih bersih dan mudah diuji. Jika saya menulis kode ini tanpa DI, layanan akan terlihat seperti itu:
@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);
}
}
Sekarang jauh lebih sulit untuk mengujinya. Selain itu, konverter baru akan dibuat untuk setiap operasi konversi, meskipun selalu dalam keadaan yang sama, yang tampak seperti overhead.
Ada beberapa pola terkenal di Spring MVC: Pengontrol menggunakan Layanan dan Layanan menggunakan Repositori. Kemudian, jika Repositori diotorisasi secara otomatis (yang biasanya demikian), maka Layanan juga harus diotorisasi secara otomatis. Dan ini cukup jelas. Tapi kapan kita menggunakan anotasi @Component? Jika Anda memiliki beberapa kelas util statis (seperti konverter, pemetaan) - apakah Anda mengotomatiskannya?
Apakah Anda mencoba membuat semua kelas diotomatiskan? Maka semua dependensi kelas mudah disuntikkan (sekali lagi, mudah dimengerti dan mudah diuji). Atau apakah Anda mencoba autowire hanya ketika itu benar-benar diperlukan?
Saya telah menghabiskan waktu mencari beberapa aturan umum tentang kapan harus menggunakan autowiring, tetapi saya tidak dapat menemukan tips khusus. Biasanya, orang berbicara tentang "apakah Anda menggunakan DI? (Ya / tidak)" atau "jenis injeksi ketergantungan apa yang Anda sukai", yang tidak menjawab pertanyaan saya.
Saya akan berterima kasih atas tips tentang topik ini!