Spring: исключение NullPointerException при внедрении bean-компонента для статического свойства

Мой основной класс выглядит следующим образом:

package main;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import testbean.MySpringBeanWithDependency;

public class Main {

    public static MySpringBeanWithDependency mySpringBeanWithDependency;

    @Autowired
    public void setTest(MySpringBeanWithDependency mySpringBeanWithDependency) {
        Main.mySpringBeanWithDependency = mySpringBeanWithDependency;
    }

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        mySpringBeanWithDependency.run();
    }

}

И мой класс AppConfig выглядит следующим образом:

package main;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import testbean.MySpringBeanWithDependency;
import writer.NiceWriter;
import writer.Writer;

@PropertySource("atm.properties")
@Configuration
public class AppConfig {

    @Bean
    public MySpringBeanWithDependency mySpringBeanWithDependency() {
        return new MySpringBeanWithDependency();
    }

    @Bean
    public Writer writer() {
        return new Writer();
    }

    @Bean 
    public NiceWriter niceWriter() {
        return new NiceWriter();
    }

}

Хотя я создаю экземпляр bean-компонента с именем mySpringBeanWithDependency и назначаю его статическому полю, команда метода run () генерирует исключение NullPointerException.

Я видел этот обходной путь для ввода статических полей в некоторые ответы, но я думаю, что он не работает для меня. Может кто-нибудь указать, где я ошибаюсь и как мне этого добиться?

Инъекция зависимостей работает не так. инициализация статического поля - антипаттерн

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

Ответы 1

Main не является bean-компонентом и не является его экземпляром. Я уверен, что есть способ вставить ваш bean-компонент в статическое поле, но было бы гораздо разумнее получить bean-компонент из контекста приложения, когда он вам нужен:

public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    MySpringBeanWithDependency bean = context.getBean(MySpringBeanWithDependency.class);
    bean.run();
}

Я пытаюсь избежать getBean, потому что я читал в весенней документации, что этого следует избегать, это написано в последнем абзаце здесь

AdityaGovardhan 30.04.2018 22:11

Я не знал, что использовать getBean() не рекомендуется, спасибо за разъяснение. В этом случае я бы предположил, что способ сделать это - просто инициализировать контекст и аннотировать метод run() с помощью @PostConstruct, что означает, что он вызывается при создании экземпляра. Если bean-компонент не Lazy, он должен запустить ваше приложение. Не могу сказать, лучше ли это.

Link64 30.04.2018 23:10

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