SpringBoot 中@Autowired 注入失效原因及解决方法

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实例


上一篇:Spring篇之第(六)幕——Spring中获取Bean的几种方式


下一篇:单元测试出现:java.lang.IllegalStateException: Failed to load ApplicationContext