@Autowired与@Resource区别

您所在的位置:网站首页 autowired注解报错 @Autowired与@Resource区别

@Autowired与@Resource区别

2023-06-27 08:37| 来源: 网络整理| 查看: 265

验证过程引用代码较多,但非常简单,可放心食用 区别@Autowired@Resource 验证1.验证@Autowired的注入2.验证@Resource的注入

区别

笼统的可以说:

@Autowired是按照类型注入。 @Resource是按照名称注入。

更具体点的话:

@Autowired

@Autowired默认按照类型byType注入,如果按照类型注入时,匹配到多个结果,就会按照名称byName注入(ps:所以@Autowired也可以按照名称注入哟)。

当@Autowired通过byName进行注入时,会获取属性的name进行匹配,例如:

@Autowired private UserService userService; @Resource

@Resource默认按照byName进行属性注入,如果通过name无法找到相应的bean实例,接着就通过byType进行匹配。按照byType匹配的逻辑和@Autowired匹配走的是同一套逻辑,所以@Resource的匹配逻辑为byName -> byType -> byName。

验证

接下来将通过代码对以上结论进行验证 定义一个用户服务接口

public interface UserService { void getName(); }

定义用户服务接口的两个实现类UserServiceImpl1和UserServiceImpl2

@Service public class UserServiceImpl1 implements UserService{ @Override public void getName() { System.out.println("UserService1Impl"); } } @Service public class UserServiceImpl2 implements UserService { @Override public void getName() { System.out.println("userServiceImpl2"); } }

定义一个用户Controller

@RestController public class UserController { @Autowired private UserService userService; public void getName(){ userService.getName(); } }

定义一个main方法进行服务调用

@ComponentScan("com.lr.interfaces.byResource") public class AppConfig { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); // 获取bean工厂BeanFactory获取UserController UserController userController = context.getBean(UserController.class); userController.getName(); } } 1.验证@Autowired的注入

(1)测试1:当UserServiceImpl1和UserServiceImpl2同时存在,在UserController采用以下注入方式,必然会报错,因为@Autowired先按照byType匹配,匹配到了“userServiceImpl1”和“userServiceImpl2”,结果不唯一,只能按照byName注入,此时的name为“userService”,结果无法唯一确定,只能抛出异常。(ps:byType和byName都无法注入)

@Autowired private UserService userService;

(2)测试2:当UserServiceImpl1和UserServiceImpl2同时存在,此时相比测试1的区别是“userService”改为了“userServiceImpl1”,这次就能正确执行,并且输出结果为“userServiceImpl1”。(ps:byType查找到多个示例,通过byName注入)

@Autowired private UserService userServiceImpl1;

(3)测试3:当UserServiceImpl1和UserServiceImpl2同时存在,但此时我就想使用测试1中的“userService”该怎么办呢?这时候我们可以采用另一个注解@Qualifier来指定注入的名称,此时也能正确输出结果“userServiceImpl1”。(ps:byType查找到多个示例,通过byName注入)

@Autowired @Qualifier("userServiceImpl1") private UserService userService;

(4)测试4:当只有一个接口实现类UserServiceImpl1,毫无疑问,按照类型就能注入,打印的结果也是“userServiceImpl1”,这也是我们平时见过的最多的实现。(ps:byType注入)

2.验证@Resource的注入

(1)测试1:当UserServiceImpl1和UserServiceImpl2同时存在,在UserController采用以下注入方式,必然会报错。因为@Resource先按照byName匹配,此时的name是“userService”,没有匹配结果,只能按照byType进行配置,此时又匹配到了“userServiceImpl1”和“userServiceImpl2”,结果不唯一,只能抛出异常。(ps:byName和byType都无法注入)

@Resource private UserService userService;

(2)测试2:当UserServiceImpl1和UserServiceImpl2同时存在,此时相比测试1的区别是“userService”改为了“userServiceImpl1”,这次就能正确执行,并且输出结果为“userServiceImpl1”。(ps:通过byName匹配到了唯一的bean实例)

@Resource private UserService userServiceImpl1;

(3)测试3:当UserServiceImpl1和UserServiceImpl2同时存在,但此时我就想使用测试1中的“userService”该怎么办呢?这时候我们可以在@Resource注解中指定注入的名称,此时也能正确输出结果“userServiceImpl1”。(ps:通过byName匹配到了唯一的bean实例)

@Resource(name = "userServiceImpl1") private UserService userService;

(4)测试4:当只有一个接口实现类UserServiceImpl1,采用以下注入方式,此时是按照byType注入,打印的结果也是“userServiceImpl1”。(ps:byType注入)

@Resource private UserService userService;

参考: @Autowired与@Resource区别.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3