İlkbaharda Bağımlılık Enjeksiyonunu bir süredir kullanıyorum ve nasıl çalıştığını ve kullanmanın bazı avantaj ve dezavantajlarının ne olduğunu biliyorum. Ancak, yeni bir sınıf oluştururken sık sık merak ediyorum - Bu sınıf Spring IOC Container tarafından yönetilmeli mi?
Ve @ Otomatik ek açıklama, XML konfigürasyonu, setter enjeksiyonu, yapıcı enjeksiyonu vb. Arasındaki farklar hakkında konuşmak istemiyorum. Sorum geneldir.
Diyelim ki Dönüştürücülü bir Hizmetimiz var:
@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
}
}
Açıkçası, dönüştürücünün herhangi bir bağımlılığı yoktur, dolayısıyla otomatik olarak bağlanması gerekli değildir. Ama benim için otomatik olarak daha iyi görünüyor. Kod daha temiz ve test etmesi kolaydır. Bu kodu DI olmadan yazarsam, servis şöyle görünecektir:
@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);
}
}
Şimdi test etmek çok daha zor. Ayrıca, her zaman bir genel gider gibi gözükse de, her dönüştürme işlemi için yeni dönüştürücü oluşturulacaktır.
Spring MVC'de bilinen bazı desenler var: Depoları kullanarak Servisleri ve Servisleri kullanan kontrolörler. Ardından, Depo otomatik olarak bağlanırsa (genellikle olduğu gibi), Hizmet'in de otomatik olarak bağlanması gerekir. Ve bu oldukça açık. Fakat @Component notunu ne zaman kullanırız? Bazı statik util sınıflarınız varsa (dönüştürücüler, eşleyiciler gibi) - onları otomatik olarak dizdiniz mi?
Tüm sınıfları otomatik olarak kablolu hale getirmeye çalışıyor musunuz? O zaman tüm sınıf bağımlılıklarının enjekte edilmesi kolaydır (bir kez daha, anlaşılması ve test edilmesi kolaydır). Yoksa sadece kesinlikle gerekli olduğunda otomatik olarak çalışmayı deniyor musunuz?
Otomatik kablolamanın ne zaman kullanılacağına ilişkin genel kurallar aramak için biraz zaman harcadım, ancak belirli bir ipucu bulamadım. Genelde insanlar "DI kullanıyor musunuz? (Evet / hayır)" veya "ne tür bir bağımlılık enjeksiyonunu tercih edersiniz" hakkında konuşur, bu da sorumu cevaplamıyor.
Bu konuyla ilgili herhangi bir ipucu için minnettar olurum!