Spring Dependency Injection работает неправильно - PullRequest
0 голосов
/ 09 мая 2018

У меня есть приложение 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, он будет работать.

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

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Это не работает, потому что вы не используете @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
}
0 голосов
/ 09 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...