Я вже деякий час використовую ін'єкційну залежність навесні, і я розумію, як вона працює, і які є плюси та мінуси її використання. Однак, коли я створюю новий клас, я часто замислююся - чи повинен цим класом керувати Spring IOC Container?
І я не хочу говорити про відмінності між анотацією @Autowired, конфігурацією XML, введенням сеттера, введенням конструктора тощо. Моє запитання є загальним.
Скажімо, у нас є служба з конвертором:
@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
}
}
Зрозуміло, що перетворювач не має ніяких залежностей, тому його автоматичне з'єднання не потрібно. Але мені це здається кращим як автопровід. Код більш чистий і простий для тестування. Якщо я напишу цей код без DI, сервіс виглядатиме так:
@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);
}
}
Зараз це набагато складніше перевірити. Більше того, новий перетворювач буде створений для кожної операції перетворення, навіть якщо він завжди знаходиться в одному стані, що здається накладним.
У Spring MVC є кілька добре відомих моделей: контролери, що використовують сервіси та сервіси, що використовують репозиторії. Потім, якщо Репозиторій є автоматичним провідником (як це зазвичай є), Сервіс теж повинен бути автоматичним. І це цілком зрозуміло. Але коли ми використовуємо анотацію @Component? Якщо у вас є якісь статичні класи утиліти (наприклад, перетворювачі, картографи) - чи автоматично ви їх проводите?
Ви намагаєтеся зробити всі класи автопровідними? Тоді всі залежності класу легко вводити (ще раз, легко зрозуміти і легко перевірити). Або ви намагаєтеся автопроводити лише тоді, коли це абсолютно необхідно?
Я витратив деякий час на пошуки деяких загальних правил щодо використання автоматичної проводки, але конкретних порад не знайшов. Зазвичай люди говорять про те, "чи використовуєте ви DI? (Так / ні)" або "який тип ін'єкції залежності ви віддаєте перевагу", що не відповідає на моє запитання.
Буду вдячний за будь-які поради щодо цієї теми!