1

好吧,我有一个普通类(LovHelper),负责执行一些实用程序任务。当我说普通类是因为 LovHelper.java 没有 @Component、@Service 或 @Repository 注释。

在这个“普通课程”中,我想从 spring 中注入一个 bean,但 bean 总是为空的。看看我的类 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)。第二个解决方案工作正常,但第一个不行。

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

4

2 回答 2

4

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

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

如果不想用 标记类@Component,可以直接在 XML 配置中将类声明为 bean。如果你不想让它成为一个单例,你可以用原型范围设置它。

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

于 2013-08-21T18:18:37.953 回答
0

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

@Component
public class LovHelper {

    private static LovHelper instance;     

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

    // do stuff

在这种情况下,静态实例将保持对 Spring 感知 bean 的引用。

于 2013-08-21T18:44:38.850 回答