Spring注解之@Autowired失败的解决方案

x33g5p2x  于2022-02-12 转载在 Spring  
字(1.6k)|赞(0)|评价(0)|浏览(406)

1.关于@Autowired

介绍

使用spring,在进行配置时,主要有两种方式,一是XML方式,二是Java config的方式。@Autowire就是配置注解的其中之一,它的功能就是为我们注入一个定义好的bean对象。

作用

首先从范围来说,它属于Spring容器配置的注解,于它同属容器的配置还有:@Required,@Primary,@Qualifier等。

@Autowired从字面的意思来说就是自动装配。自动装配本来的意思是指的一些工业上的用机器代替人工,自动将一些需要完成的组装任务或者其他的任务完成。在spring中,自动装配指的就是将Spring容器中的bean自动和我们需要这个bean的类组装在一起。

2.自动注入失败的分析

1)检查扫描路径

扫描路径是由@ComponentScan来指定的,默认为标注类当前包及当前包的子包。

也就是说,标注了@ComponentScan的启动类放在com.be.fallback包下面,只会扫描com.be.fallback包中的类,以及com.be.fallback.servlet、com.be.fallback.util等子包中的类,对于com.be.service等包中的类是不会扫描的。

注意事项一:很多人没有使用@ComponentScan,但是使用了@SpringBootApplication。@SpringBootApplication是通过内部封装@ComponentScan注解来实现实例扫描的,所以使用@SpringBootApplication也是一样的。

2)检查实例注册

检查想要使用@Autowired注解自动注入依赖的类,是否标注了用来注册给Spring Boot的注解。这些注解包括@Component,`@Service,@Repository,@Controller等。

3)检查启动类

启动类的@SpringBootApplication注解最好不要加其他的条件,可能会引起莫名的问题。

之前遇到@Autowired注入失败,就是因为下面的注解

@SpringBootApplication(exclude {DataSourceAutoConfiguration.class})
//其作用就是取消自动配置单数据源「注意这里提到的单数据源」。

3.如上述分析之后,还无法解决自动注入失败,则可选择下面的终极方案

1)用bean名称获取bean

封装一个工具类GetBean实现ApplicationContextAware

@Component
public class GetBean implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (GetBean.applicationContext == null) {
            GetBean.applicationContext = applicationContext;
        }
    }
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name){
        return getApplicationContext().getBean(name);
    }

}

获取bean

private static RedisTemplate redisTemplate=(RedisTemplate) GetBean.getBean("redisTemplate");

相关文章