解决@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、其他问题。

如果上述步骤检查完成,服务启动又没有产生其他异常,这时候基本上已经排查代码的问题。这时候需要检查依赖、开发环境等是否有问题。检查依赖需要了解自己需要哪些依赖,看是否配置齐全;检查开发环境,可以通过将代码拷贝到其他机器上执行来判断。

经验分享 程序员 微信小程序 职场和发展