У меня есть приложение 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 не является @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
}
большой! Так держать
Ваш класс MyPanel не похож на bean-компонент. Может в этом проблема.