今天写代码遇到了一个异常,关于@AutoWired自动装配的问题。
控制台的异常是:
严重: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'coachController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.chaoting.gym.service.CoachService com.chaoting.gym.controller.CoachController.coachService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.chaoting.gym.service.CoachService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
首先说说@AutoWired的作用:
它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
通过 @Autowired的使用来消除 set ,get方法。在使用@Autowired之前,我们对一个bean配置起属性时,是这样用的
<property name="" value="">
现在我们在声明属性的时候在上面加一个@AutoWired,就可根据类的类型或者名字帮我们自动装配到bean中。
那@AutoWired是怎么装配:
1)首先通过类型去查找对应的bean,如果类型是唯一的,那就自动帮我们注入到Bean中。
2)如果类型是多个,那就根据名称查找对应的bean。
3)如果查询结果为空,那就抛出异常
解决的方法是给@AutoWired加一个属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错。
当然,这里我不建议用这个解决方法,如果相同的类型有多个,那就给他加一个名称,可以用:
@Autowired
@Qualifier(“userController”)
private UserController userController;
我这里出异常的原因我检查了一下,首先我的类型肯定是唯一的,而且名称也是唯一的,但是依然出异常,我加上了required=false是可以解决,但是我认为我的spring容器中是有要注入的bean,然后最后我发现因为我的service,我是写了一个接口,然后实现接口,给一个@Service的注解,但是我的Controller找不到它,结果发现是因为我的类没有实现接口,所以我给serviceImpl加了注解,但是controller装配的是接口,所以AutoWired找不到它。太大意了,很不应该犯的一个错误。这里记录下来,希望可以让其他人避免出现这样的结果。