SpringBoot 中@Autowired 注入失效原因及解决方法
1、原因分析
1.1 包没有被扫描到
通过@Autowired注入的类所在的包路径不在Application启动类所在的包/子包路径下。
Spring Boot项目的Bean装配默认规则是根据Application类(指项目入口类)所在的包位置从上往下扫描。
eg: Application启动类在包com.alibaba.taobao下,则只会扫描com.alibaba.taobao包及其所有子包,如果需要自动装载的类所在包不在com.alibaba.taobao及其子包下,而是在com.alibaba.tmall下,则不会被扫描,自然就没法被注入!
1.2 代码中使用new关键字创建实例
若类A中包含成员属性B, B是通过@Autowired自动注入,而类A的实例是通过new的方式产生,则自动注入会失效的。
2、针对上述的解决方法
2.1 添加包扫描
在启动类中定义分别扫描两个包 ,即在@SpringBootApplication注解的类中添加:@ComponentScan({“com.alibaba.taobao”,“com.alibaba.tmall”})
2.2 通过Spring上下文工具类获取bean
定义一个SpringUtil类
/**
* Spring上下文工具类,用以让普通类获取Spring容器中的Bean
*/
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
//获取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringUtil.applicationContext == null) {
SpringUtil.applicationContext = applicationContext;
}
}
//通过name获取 Bean
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
}
然后在类A中通过如下调用获取Spring容器中的B实例