Spring @Autowired注册为空,最常见的原因是查看自动注入的服务是否被注册为Bean,由容器来管理。
还有一个原因稍微隐晦一点,就是自动注入的服务的对象是new 来的,而不是通过Spring容器来管理。
比如:
1.先定义一个服务
@Service("xxxService")
public class Xxxmpl implements Ixxx{
@Override
public void doSomething(){
//
}
}
2.调用服务
public class BClazz{
@Autowired
private Ixxx xxxService;
public void doSomething(){
}
}
3、如果BClass 的示例是 通过 new BClazz()来的,那么会注入失败,xxxService为null.
解决办法就是在使用到服务的时候,动态去加载Bean,常用的是实现ApplicationContextAware接口方式,代码如下:
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringContextUtil implements ApplicationContextAware{
// Spring应用上下文环境
private static ApplicationContext applicationContext;
/**
* 实现ApplicationContextAware接口的回调方法,设置上下文环境
*
* @param applicationContext
*/
public void setApplicationContext(ApplicationContext applicationContext) {
SpringContextUtil.applicationContext = applicationContext;
}
/**
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 获取对象
* 这里重写了bean方法,起主要作用
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws BeansException
*/
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> requiredType) {
return applicationContext.getBean(requiredType);
}
}