前言:
在日常的开发项目当中,这两个注解是经常会用到的,但是在实际使用当中好像使用起来并没有多大区别,这里我就对这两个注解进行一个详细的区别总结,通过一个完整的典型例子进行论证,思路清晰明了。
目录
(三)、使用@Autowired+@Qualifier进行注入
先说结论:
这里我搭建了一个简单的springboot项目,并写了一个接口和其对应的两个实现类,来具体通过代码来证明以上的结论。
UserService接口:
1 2 3 4 5 6 |
package com.ithuang.demo.service; public interface UserService { public void insert(); } |
UserServiceImpl实现类
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.ithuang.demo.service.serviceImpl; import com.ithuang.demo.service.UserService; import org.springframework.stereotype.Service; @Service("service") public class UserServiceImpl implements UserService { @Override public void insert() { System.out.println("方法1:执行了插入操作..."); } } |
UserServiceImpl2实现类
1 2 3 4 5 6 7 8 9 10 11 12 |
package com.ithuang.demo.service.serviceImpl; import com.ithuang.demo.service.UserService; import org.springframework.stereotype.Service; @Service("service2") public class UserServiceImpl2 implements UserService { @Override public void insert() { System.out.println("方法2:执行了插入操作..."); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.ithuang.demo; import com.ithuang.demo.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Autowired private UserService userService; @Test void test() { userService.insert(); } } |
运行结果
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.ithuang.demo.DemoApplicationTests': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.ithuang.demo.service.UserService' available: expected single matching bean but found 2: userServiceImpl,userServiceImpl2
大概意思就是说在使用@Autowired进行注入的时候,默认根据了类型进行了注入,并没有指定Bean的名称,导致了Spring容器发现了两个Bean,从而不知道注入哪个Bean。
单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.ithuang.demo; import com.ithuang.demo.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class DemoApplicationTests { @Autowired @Qualifier("service2") private UserService userService; @Test void test() { userService.insert(); } } |
运行结果
方法2:执行了插入操作…
这次便成功完成了注入并且在控制台输出了第二个实现类当中的方法,通过@Qualifier来指定Bean的名称进行了注入。
单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.ithuang.demo; import com.ithuang.demo.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; @SpringBootTest class DemoApplicationTests { @Resource private UserService userService; @Test void test() { userService.insert(); } } |
运行结果
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.ithuang.demo.DemoApplicationTests': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.ithuang.demo.service.UserService' available: expected single matching bean but found 2: service,service2
还是和之前一样的问题,因为@Resource并没有通过name指向具体的Bean,导致无法完成注入。
单元测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.ithuang.demo; import com.ithuang.demo.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; @SpringBootTest class DemoApplicationTests { @Resource(name = "service") private UserService userService; @Test void test() { userService.insert(); } } |
运行结果
方法1:执行了插入操作…
这次控制台正常输入,通过name指定Bean的名称来完成注入即可。
以上就是我对@Autowired和@Resource两个在工作当中经常用到的注解的理解和分享。
from:https://blog.csdn.net/HJW_233/article/details/126733085