好吧,我有一个普通的类(LovHelper),负责执行一些utils任务。当我说普通的类是因为LovHelper.java没有@ Component,@ Service或@Repository批注。

在这个“正常类”内部,我想从春天注入一个豆,但是该豆始终为空。看下面的我的类LovHelper.java:

package br.com.odontonew.helper;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.odontonew.bean.Lov;
import br.com.odontonew.dao.BasicDAO;

public class LovHelper {

    @Autowired
    private BasicDAO dao;

    private static LovHelper instance;


    private LovHelper(){

    }

    public static LovHelper getInstance(){
        if (instance == null)
            instance = new LovHelper();

        return instance;
    }


    public Lov getLovByCodigo(Class lovClass, String codigo){
        Map<String,Object> map = new HashMap<String,Object>();
        map.put("codigo", codigo);
        List<Lov> lovs = (List<Lov>)dao.findByQuery("SELECT c FROM "+lovClass.getName()+" c WHERE c.codigo = :codigo", map);
        if (lovs.size() == 1)
            return lovs.get(0);
        else
            return null;
    }


    /*Getters and Setters*/
    public BasicDAO getDao() {
        return dao;
    }

    public void setDao(BasicDAO dao) {
        this.dao = dao;
    }

}


因此,在另一个类中,我只是调用:LovHelper.getInstance()。getLovByCodigo(param1,param2)。但是我总是得到一个NullPointerException,因为LovHelper中的bean“ dao”为NULL。

经过一番思考后,我决定将LovHelper.java(使用单例模式)更改为用于Spring注入的Bean,然后放置@Component注释并删除所有已开发的单例模式。
在另一个类中,我注入“ lovHelper”并像这样使用:lovHelper.getLovByCodigo(param1,param2)。第二种解决方案可以正常工作,但第一种解决方案则不能。

最后,我的疑问是:为什么原始代码(如发布的)不起作用。

最佳答案

Spring将仅处理对由容器构造的类的注入依赖项。调用getInstance()时,您是在分配对象本身……Spring没有机会注入具有@Autowired的依赖项。

您的第二个解决方案有效,因为Spring知道您的LovHelper类。它负责构造它,并将其注入到其他类中。

如果不想用@Component标记该类,则可以直接在XML配置中将该类声明为bean。如果不想让它成为单例,则可以使用prototype scope进行设置。

如果您确实需要自己管理课程,则可以考虑查看@Configurable。我相信它旨在解决此问题,但它需要各个方面,而我自己并没有玩过它。

10-06 12:38