Я уже некоторое время использую Dependency Injection в Spring, и я понимаю, как это работает и каковы некоторые плюсы и минусы его использования. Однако, когда я создаю новый класс, я часто задаюсь вопросом - должен ли этот класс управляться 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? (Да / нет)» или «какой тип внедрения зависимостей вы предпочитаете», что не отвечает на мой вопрос.
Буду благодарен за любые советы по этой теме!