Spring 4:在实例化ClassPathXmlApplicationContext期间发生NullPointerException

时间:2016-02-27 19:41:24

标签: java spring

我正在开发一个使用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之前。知道为什么吗?

1 个答案:

答案 0 :(得分:2)

注射顺序如下:

  1. 构造函数args
  2. 字段
  3. 塞特斯/方法
  4. 引擎盖下,Spring(或任何DI框架)通过调用构造函数创建您的类,然后注入依赖项。因此,您无法在构造函数中使用注入的字段:它们将在之后注入。

    您应该在构造函数中注入所需的依赖项:

    @Autowired
    public Gui(NetManager netManager) {
      this.netManager = netManager;
      netManager.init("Username");
                ...
    }