@Autowired 与 @Resource 注解的使用究竟有何区别?

前言

@Autowired 和 @Resource 都是 Spring/Spring Boot
项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同。在字段上使用Spring的依赖注入注解@Autowired后会出现警告,但是使用@Resource却不会出现。

@Autowired 和 @Resource 的区别主要体现在以下 5 点:

1.来源不同;
2.依赖查找的顺序不同;
3.支持的参数不同;
4.依赖注入的支持不同;
5.编译器 IDEA 的提示不同。

1.来源不同

@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而@Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)。

2.依赖查找顺序不同

依赖注入的功能,是通过先在 Spring IoC容器中查找对象,再将对象注入引入到当前类中。而查找有分为两种实现:按名称(byName)查找或按类型(byType)查找,其中@Autowired 和 @Resource 都是既使用了名称查找又使用了类型查找,但二者进行查找的顺序却截然相反。

2.1 @Autowired 查找顺序

@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找。

2.2 @Resource 查找顺序

@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找。

3.支持的参数不同

@Autowired 和 @Resource 在使用时都可以设置参数,比如给 @Resource 注解设置 name 和 type参数,实现代码如下:

	@Resource(name = "doctorService",type = IUserPushService.class)
	private IUserPushService pushService;

但二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个。required的参数,而 @Resource 支持 7 个参数,支持的参数如下所示:

	@Autowired:required
	@Resource:  name,lookup,type,authenticationType,shareable,mappedName,description

4.依赖注入的支持不同

@Autowired 和 @Resource 支持依赖注入的用法不同,常见依赖注入有以下 3 种实现:

1.属性注入
2.构造方法注入
3.Setter 注入

这 3 种实现注入的实现代码如下。

a) 属性注入

	@RestController
	public class UserController {
	    // 属性注入
	    @Autowired
	    private UserService userService;
	}

b) 构造方法注入

	@RestController
	public class UserController {
	    // 构造方法注入
	    private UserService userService;
	
	    @Autowired
	    public UserController(UserService userService) {
	        this.userService = userService;
	    }
	}

基于构造函数注入的主要优点是可以将需要注入的字段声明为final, 使得它们会在类实例化期间被初始化,这对于所需的依赖项很方便。在spring官方文档中,@Autowired注解也是可以省去的。
c) Setter 注入

	@RestController
	public class UserController {
	    // Setter 注入
	    private UserService userService;
	
	    @Autowired
	    public void setUserService(UserService userService) {
	        this.userService = userService;
	    }
	}

其中,@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入。

5.编译器提示不同

当使用 IDEA 在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息,报错内容如下图所示:
在这里插入图片描述

虽然 IDEA 会出现报错信息,但程序是可以正常执行的。然后,我们再将依赖注入的注解更改为 @Resource 就不会出现报错信息了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值