Spring Dependency Injection работает некорректно

У меня есть приложение Spring / Swing, в котором я экспериментирую с DI, но что бы я ни делал до сих пор, я не мог заставить его работать должным образом. Вот несколько примеров классов, над которыми я работаю;

public class Launcher {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                ApplicationContext context = null;
                try {
                    context = new AnnotationConfigApplicationContext(AppConfig.class);
                    MainFrame mainFrame = (MainFrame) context.getBean("mainFrame");
                    mainFrame.init();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (context != null)
                        ((ConfigurableApplicationContext) context).close();
                }
            }
        });

    }

}


@Configuration
@ComponentScan("tr.com.example.*")
public class AppConfig {

    @Bean(name = "mainFrame")
    public MainFrame createMainFrame() {
        return new MainFrame();
    }
}


public class MyPanel{

    @Autowired
    MyManager manager;

    ...do stuff
}


@Service
public class MyManager{
    ...do stuff
}

Итак, когда я пытаюсь внедрить MyManager в MyPanel, я получаю исключение NullPointerException. Но если я попытаюсь ввести его в MainFrame, он сработает.

Может кто-нибудь объяснить мне, что здесь не так и как мне это сделать правильно?

Заранее спасибо.

Ваш класс MyPanel не похож на bean-компонент. Может в этом проблема.

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

Ответы 2

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

Ваш MyPanel не является @Component, поэтому он невидим для Spring, и никакие @Autowired или другие аннотации не будут обрабатываться.

Ключ к Spring - использовать его полностью. Если вы не знаете, что что-то не должно быть bean-компонентом (то есть классом домена, сущностью и т. д.), Это, вероятно, должно быть bean-компонентом.

Это не работает, потому что вы не использовали @Component поверх MyPanel

public class Launcher {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                ApplicationContext context = null;
                try {
                    context = new AnnotationConfigApplicationContext(AppConfig.class);
                    MainFrame mainFrame = (MainFrame) context.getBean("mainFrame");
                    mainFrame.init();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (context != null)
                        ((ConfigurableApplicationContext) context).close();
                }
            }
        });

    }

}


@Configuration
@ComponentScan("tr.com.example.*")
public class AppConfig {

    @Bean(name = "mainFrame")
    public MainFrame createMainFrame() {
        return new MainFrame();
    }
}

@Component
public class MyPanel{

    @Autowired
    MyManager manager;

    ...do stuff
}


@Service
public class MyManager{
    ...do stuff
}

большой! Так держать

ayushs27 09.05.2018 13:56

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