我正在开发一个使用javaFX的独立Spring 4应用程序。但是,当我尝试创建一个新的ClassPathXmlApplicationContext
时,所有自动连接的字段都为空,导致NPE,即使我让Spring实例化我的类。
这是我的主要课程:
public class Main extends Application {
public static void main(String[] args) {
launch();
}
public void start(Stage stage) {
ConfigurableApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
Gui gui = context.getBean(Gui.class);
stage.setScene(new Scene(gui, 400, 400));
stage.show();
}
}
这是我的spring-config.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<context:annotation-config />
<context:component-scan base-package="org.my.package" />
</beans>
桂班:
@Controller
@Scope("singleton")
public class Gui extends GridPane {
@Autowired
private NetManager netManager;
@Autowired
private MessengerComponent messenger;
public Gui() {
netManager.init("Username");
...
}
}
NetManager.class:
@Service
@Scope("singleton")
public class NetManager {
...
}
NPE发生在我甚至在创建应用程序上下文期间检索第一个bean之前。知道为什么吗?
答案 0 :(得分:2)
注射顺序如下:
引擎盖下,Spring(或任何DI框架)通过调用构造函数创建您的类,然后注入依赖项。因此,您无法在构造函数中使用注入的字段:它们将在之后注入。
您应该在构造函数中注入所需的依赖项:
@Autowired
public Gui(NetManager netManager) {
this.netManager = netManager;
netManager.init("Username");
...
}