好吧,我有一个普通的类(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
。我相信它旨在解决此问题,但它需要各个方面,而我自己并没有玩过它。