Почему в статическом поле нельзя использовать нестатический репозиторий и почему возникает NullPointerException?
Что проверяют
Различаете ли вы уровень класса и уровень экземпляра и понимаете ли, что контейнер внедряет зависимости в объект, а не в класс. Вопрос обычно вырастает из разбора реального падения.
Как отвечать
Статическое поле принадлежит классу и живёт с момента его инициализации. Нестатическое принадлежит объекту. Spring создаёт бин и заполняет его через конструктор или сеттер, то есть работает с конкретным экземпляром. Статическое поле мимо этой схемы: @Autowired на нём просто игнорируется, поле остаётся null, и первое обращение даёт NullPointerException.
@Service
public class ReportService {
@Autowired
private static UserRepository repo; // останется null
public static void run() {
repo.findAll(); // NPE
}
}Правильный вариант: поле обычное private final, репозиторий приходит конструктором, класс объявлен бином, а вызывающий получает этот бин, а не дёргает статический метод.
Полезно отделить второй случай, который часто приплетают к этому же вопросу: обращение к нестатическому полю прямо из статического метода. Это не NullPointerException, а ошибка компиляции про обращение к нестатической переменной из статического контекста.
Где спотыкаются
Путают два разных отказа. Компилятор не пускает статический метод к полю экземпляра, и до запуска дело не доходит. А NullPointerException означает, что поле объявлено правильно, но никто его не заполнил, и виновата не статика сама по себе, а то, что заполнять статику контейнеру нечем.
Городят костыль: нестатический сеттер, который пишет в статическое поле. Работает, пока бин один и создаётся раньше первого вызова, но порядок инициализации ничем не гарантирован, а в тестах такое поле остаётся заполненным между классами и даёт плавающие падения.
Считают, что static экономит память. Бин в Spring по умолчанию синглтон, отдельное статическое поле не экономит ничего, зато убирает возможность подменить зависимость в тесте и делает класс непригодным для нескольких конфигураций.