Можете ли вы получить доступ к полям @Autowire'd через статические ссылки?

Допустим, у вас есть следующая настройка:

public class Producer {

    public Product produce() { /* Creates some product */ }
}

@Service
public class ProductService {

    @Autowired
    private Producer producer;

    public Product produce() { producer.produce(); }
}

public class Factory {

    private static ProductService productService = new ProductService();

    public static Product produce() { productService.produce(); }
}

Когда я вызываю Factory.produce(), я получаю NullPointerException, потому что producer имеет значение null. Поскольку producer само по себе не является статическим полем, я надеялся, что, настроив его таким образом, я смогу использовать внедрение зависимостей Springs в статическом контексте. Я ошибся или это просто невозможно?

Для контекста: в моем реальном приложении Factory содержит несколько сервисов, каждый из которых, в свою очередь, содержит несколько производителей. Я выбрал эту структуру, поэтому остальной части моего приложения нужен только доступ к Factory, при этом вся сложность, стоящая за ней, абстрагируется ею.

правильно ли введен продуктService в классе Factory? Или ты просто не поставил?

jorrin 01.03.2024 16:24

@jorrin Забыл конструктор. Поскольку это статическая ссылка, ее нельзя внедрить. Это основная проблема, которую я пытаюсь обойти, делая это.

TigersEye120 01.03.2024 16:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто добавьте к конструктору Factory аннотацию @Autowired.

@Component
public class Factory {

    private static ProductService productService;

    @Autowired
    public Factory(ProductService productService) {
        Factory.productService = productService;
    }

    public static Product produce() { productService.produce(); }
}

Другие вопросы по теме