使用Spring注入创建一个普通类

时间:2013-08-21 18:10:13

标签: java spring

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

在这个“普通类”里面我想从spring注入一个bean,但是bean总是为null。看看我的班级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(使用单例模式)更改为Bean for Spring注入,然后我放置@Component注释并删除所开发的所有单例模式。 在另一个类中,我注入“lovHelper”并使用如下:lovHelper.getLovByCodigo(param1,param2)。第二个解决方案工作正常,但第一个没有。

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

2 个答案:

答案 0 :(得分:4)

Spring只会处理由容器构造的类的注入依赖项。当你调用getInstance()时,你正在分配对象本身...... Spring没有机会注入你拥有@Autowired的依赖项。

你的第二个解决方案有效,因为Spring知道你的LovHelper类;它处理构建它并将其注入你的其他类。

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

如果您真的需要自己管理课程,可以考虑查看@Configurable。我相信它的目的是解决这个问题,但它需要方面,而我自己也没有玩过它。

答案 1 :(得分:0)

您的助手应该是上下文感知的,但您可以将其设为静态:

@Component
public class LovHelper {

    private static LovHelper instance;     

    @PostConstruct
    void init() {
        instance = this;
    } 

    // do stuff

在这种情况下,静态实例将继续引用Spring aware bean。