最近工作中遇到一个关于@AutoWired注解使用的细节问题,以前没有注意到,现在特意记录一下。
问题描述:在我的一个工具类中,使用@Autowired需要注入一个dao对象,然后工具类的方法中会调用该dao对象中的方法,在运行时发现报空指针异常,dao对象居然是null。
相关代码如下:
工具类代码如下: /** * 对象级的码表转换工具类 * @author: lsl */ public class CodeTransHolderUtils {
private static Logger logger = LoggerFactory.getLogger(CodeTransHolderUtils.class);
@Autowired
ServiceAttrDictDao serviceAttrDictDao;
public List<ServiceAttrDictBO> qryBySysAndServiceAndMethod(String pcmsSysCode, String serName) {
return serviceAttrDictDao.qryBySysAndServiceAndMethod(pcmsSysCode,serName); //这里报空指针异常
}
}
dao层代码如下:
/** * @author: lsl */ @Repository("serviceAttrDictDao") public class ServiceAttrDictDaoImpl implements ServiceAttrDictDao {}
分析原因:原来要使用@Autowired注解,那么注解所在类必须交给spring容器管理。即我的CodeTransHolderUtils这个类必须在xml文件中配置或者加@Component、@Service等注解交给spring。
解决办法:由于我的是这个类是工具类,不需要交给spring管理(当然也可以交个spring管理),需要通过代码获得该dao对象。
代码如下:
/** * @author: lsl */ public class CodeTransHolderUtils { private static Logger logger = LoggerFactory.getLogger(CodeTransHolderUtils.class); // @Autowired // ServiceAttrDictDao serviceAttrDictDao; //SpringContextHolder是我们内部一个工具类,作用是从ApplicationContext中获取bean public ServiceAttrDictDao getServiceAttrDictDao(){ return (ServiceAttrDictDao)SpringContextHolder.getBean("serviceAttrDictDao"); }public List<ServiceAttrDictBO> qryBySysAndServiceAndMethod(String pcmsSysCode, String serName) { return getServiceAttrDictDao().qryBySysAndServiceAndMethod(pcmsSysCode,serName); }
}