解决@Autowired注入依赖失败的问题
1、现象描述:
在Spring Boot项目中使用@Autowired注解,程序启动时发现服务启动失败,提示:
Description: Field metrics in com.be.fallback.servlet.FallbackServlet required a bean of type com.be.fallback.metrics.FallbackMetrics that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type com.be.fallback.metrics.FallbackMetrics in your configuration.
2、问题分析:
这里的错误原因很好分析。结合报错信息及代码,报错处的代码为FallbackMetrics注解了@Autowired进行依赖注入,但是没有找到可以被用来注入的实例。即Spring Boot获取FallbackMetrics的实例失败。
3、解决方案:
根据分析,需要检查可能导致Spring Boot依赖注入失败的因素。
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也是一样的。
注意事项二:也可以通过为@ComponentScan或@SpringBootApplication注解指定参数来修改扫描路劲,示例:
// 如果使用@ComponentScan注解: @ComponentScan(basePackages = "com.be.fallback") // 如果使用@SpringBootApplication注解: @SpringBootApplication(scanBasePackages = "com.be.fallback")
2、检查实例注册。
检查想要使用@Autowired注解自动注入依赖的类,是否标注了用来注册给Spring Boot的注解。这些注解包括@Component,@Service,@Repository,@Controller等。
3、其他问题。
如果上述步骤检查完成,服务启动又没有产生其他异常,这时候基本上已经排查代码的问题。这时候需要检查依赖、开发环境等是否有问题。检查依赖需要了解自己需要哪些依赖,看是否配置齐全;检查开发环境,可以通过将代码拷贝到其他机器上执行来判断。