好吧,我有一个普通的类(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)。第二个解决方案工作正常,但第一个没有。
最后,我的疑问是:为什么原始代码(如已发布)不起作用。
答案 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。