Ответ
По умолчанию зависимость, аннотированная @Autowired, является обязательной. Если Spring не сможет найти подходящего бина для внедрения, будет выброшено исключение NoSuchBeanDefinitionException.
Чтобы сделать зависимость необязательной, необходимо явно установить атрибут required = false.
Примеры:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Optional;
@Service
public class MyService {
// 1. Обязательная зависимость (по умолчанию)
@Autowired
private SomeRepository repository;
// 2. Необязательная зависимость через required = false
@Autowired(required = false)
private OptionalDependency optionalDep; // Будет null, если бин не найден
// 3. Рекомендуемый способ для необязательных зависимостей (Spring 4.3+)
private final Optional<OptionalDependency> safeOptionalDep;
@Autowired
public MyService(Optional<OptionalDependency> safeOptionalDep) {
this.safeOptionalDep = safeOptionalDep; // Optional.empty() если бина нет
}
}
Важные нюансы:
- Начиная с Spring 4.3,
@Autowiredна единственном конструкторе можно опускать, и все его аргументы считаются обязательными. - Использование
Optional<>(как в примере 3) — это наиболее чистый и безопасный способ работы с необязательными зависимостями в современном Spring.