autowired注入dao为null

@Component//这里必须有注入才能进来,换成@Service也不好使,我想在应用启动的时候初始化一些东西
public class ExceptionCode {

    public static Map<String, String> map = null;
    
//    public ExceptionCode(){}
    
    @Autowired//这里不知道为什么为null
    private ICmpDao cmpDao;
    
    /**
     * 初始化异常编号
     */
    public ExceptionCode(){
        if(cmpDao == null)
            throw new RuntimeException(" cmpOutDao is null");
        List<CmpException> list = 
                cmpDao.searchExceptionCodeList();
        if(list == null || list.size() <= 0)
            throw new RuntimeException(""
                    + " cmp exception code table not data ");
        map = new HashMap<String, String>();
        for (CmpException ec : list)
            map.put(ec.getCode(),ec.getTmCode());
    }
}

之前在struts2框架下是这么写的好使,但现在代码需要移动到Spring不知道怎么写了,或者我应该怎么改?

public class ExceptionCode {

    public static Map<String, String> map = null;
    
    public ExceptionCode(){}
    
    /**
     * 初始化异常编号
     */
    public ExceptionCode(ICmpDao cmpDao){
        if(cmpDao == null)
            throw new RuntimeException(" cmpOutDao is null");
        List<CmpException> list = 
                cmpDao.searchExceptionCodeList();
        if(list == null || list.size() <= 0)
            throw new RuntimeException(""
                    + " cmp exception code table not data ");
        map = new HashMap<String, String>();
        for (CmpException ec : list)
            map.put(ec.getCode(),ec.getTmCode());
    }
}
阅读 12.8k
5 个回答

cmpDaonull只有一个原因, 那就是你所使用的ExceptionCode对象没有被IoC容器所管理.
你使用的对象是自己new出来的, 而不由spring创建的, 当然没有办法使用DI依赖注入.

反之如果你的ExceptionCode对象由IoC容器管理, 但是容器中如果不存在cmpDao那在spring初始化的时候你将会得到NoSuchBeanDefinitionException异常.


PS:
@Autowired(required = false) 如果你的注解有手动标识该对象可能不存在, 此时spring在未找到对象时才可能注入null

ICmpDao 这个类也需要添加 @Repository 注解,并且需要保证两个类都在 spring 扫描包范围内

spring 容器里是否有 ICmpDao 类型的bean?如果没有 spring 容器无法注入 bean

问题可能出在 ICmpDao 这个类,不知道你怎么写的。

楼主你是在无参构造器当中进行的一些操作,spring bean加载的过程应该是首先调用无参构造器,创建实体,因此,这个时候,属性的值还没注入。
因此,建议楼主实现InitializingBean的接口,重写其方法,将你的初始化动作在这里实现。
也可以实现一些其他的接口。http://www.jianshu.com/p/2945...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题