Bây giờ tôi đã sử dụng Dependency Injection vào mùa xuân và tôi hiểu cách thức hoạt động của nó và một số ưu và nhược điểm của việc sử dụng nó. Tuy nhiên, khi tôi tạo một lớp mới, tôi thường tự hỏi - Lớp này có được quản lý bởi Spring IOC Container không?
Và tôi không muốn nói về sự khác biệt giữa chú thích @Autowired, cấu hình XML, tiêm setter, tiêm constructor, v.v. Câu hỏi của tôi là một câu hỏi chung.
Giả sử chúng ta có Dịch vụ với Trình chuyển đổi:
@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
}
}
Rõ ràng, trình chuyển đổi không có bất kỳ sự phụ thuộc nào, do đó không cần thiết phải tự động chuyển đổi. Nhưng đối với tôi nó có vẻ tốt hơn như tự động. Mã sạch hơn và dễ kiểm tra. Nếu tôi viết mã này mà không có DI, dịch vụ sẽ trông như thế:
@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);
}
}
Bây giờ khó khăn hơn nhiều để kiểm tra nó. Hơn nữa, bộ chuyển đổi mới sẽ được tạo cho mọi hoạt động chuyển đổi, mặc dù nó luôn ở cùng một trạng thái, có vẻ như là một chi phí hoạt động.
Có một số mẫu nổi tiếng trong Spring MVC: Bộ điều khiển sử dụng Dịch vụ và Dịch vụ sử dụng Kho lưu trữ. Sau đó, nếu Kho lưu trữ được tự động (thường là vậy), thì Dịch vụ cũng phải được tự động. Và điều này khá rõ ràng. Nhưng khi nào chúng ta sử dụng chú thích @Component? Nếu bạn có một số lớp sử dụng tĩnh (như trình chuyển đổi, trình ánh xạ) - bạn có tự động xác nhận chúng không?
Bạn có cố gắng để làm cho tất cả các lớp tự động? Sau đó, tất cả các phụ thuộc lớp đều dễ tiêm (một lần nữa, dễ hiểu và dễ kiểm tra). Hay bạn chỉ cố gắng tự động khi nó thực sự cần thiết?
Tôi đã dành một chút thời gian để tìm kiếm một số quy tắc chung về thời điểm sử dụng tính năng tự động, nhưng tôi không thể tìm thấy bất kỳ lời khuyên cụ thể nào. Thông thường, mọi người nói về "bạn có sử dụng DI? (Có / không)" hoặc "bạn thích loại tiêm phụ thuộc nào" không trả lời câu hỏi của tôi.
Tôi sẽ biết ơn bất kỳ lời khuyên liên quan đến chủ đề này!