0

我有以下 Java 类,它有一个dao由构造函数 args 注入的字段:

public class FeatureFormationFromRaw {

    private MyDAOImpl dao;   //field to be injected from beam.xml

    public FeatureFormationFromRaw(MyDAOImpl dao) {
        //do a fresh clean and save all data, dependency injection by constructor args
        dao.removeAll();          //This is fine.
        dao.saveDataAll();        // This is fine.
    }


    public float calcuFeatures(String caseName) {

        List<JSONObject> rawData = dao.getData(caseName);    //This line throws NullPointException because dao=null here.
                .........
    }

    public static void main(String[] args) {

        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
        FeatureFormationFromRaw featureForm = (FeatureFormationFromRaw) context.getBean("featureFormation");

        float value = featureForm.calcuFeatures("000034");

    }

}

bean 配置文件通过构造函数 args 将对象bean.xml注入到类中:MyDAOImpl

    <bean id="featureFormation" class="com.example.FeatureFormationFromRaw">
        <constructor-arg ref="myDaoImpl" />
    </bean>

    <bean id="myDaoImpl" class="com.example.MyDAOImpl">
    </bean>

我调试了我的应用程序,发现FeatureFormationFromRaw(MyDAOImpl dao)执行构造函数时,dao从 Spring bean 注入中获取了正确的值。但是,当calcuFeatures()调用该方法时,变量dao在第一行为空。这是为什么?为什么dao构造函数调用后变量消失并变为null?

4

2 回答 2

5

在您的构造函数中,传入 dao 后,您必须将 dao 分配给您的私有变量。否则你不能在其他任何地方调用它。

添加this.dao = dao;到您的构造函数。

换句话说,当您dao.removeAll()在构造函数中调用时,这是有效的,因为它使用了参数dao。但是当您调用dao.getData()另一个方法时,它会失败,因为它使用的private MyDAOImpl dao;是尚未初始化的。注入将其放入构造函数中,但不将其放入私有变量中。你必须这样做。

于 2013-09-11T15:09:25.917 回答
1
private MyDAOImpl dao;   //field to be injected from beam.xml

    public FeatureFormationFromRaw(MyDAOImpl dao) {
        //do a fresh clean and save all data, dependency injection by constructor args
        dao.removeAll();          //This is fine.
        dao.saveDataAll();        // This is fine.
    }

在你的构造函数中添加this.dao = dao;..which 没有被分配,所以当你使用其他方法时,它null会结束NPE

于 2013-09-11T15:13:10.307 回答