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"})

@ComponentScan({"com.alibaba"})

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实例
ClassBInterface b = (ClassBInterfaceImpl) SpringUtil.getBean("classBInterfaceImpl");

你可能感兴趣的:(SpringBoot 中@Autowired 注入失效原因及解决方法)