既生@Resource,何生@Autowired,是Spring官方没事做?

@Resource和@Autowired是Spring中处理依赖注入的两种方式,各自有其设计理念。@Resource按名称注入,@Autowired则按类型匹配。尽管功能相近,但它们源于不同的规范,@Resource属于JSR-250,更便于框架间迁移。属性上使用@Autowired可能引发Idea警告,推荐使用构造方法注入,以保证代码质量并避免循环依赖问题。
摘要由CSDN通过智能技术生成

真的是没事做了吗?读了本文你将会了解到:

1.@Resource和@Autowired来源

2.Spring官方为什么会支持这两个功能如此相似的注解?

3.为什么@Autowired属性注入的时候Idea会曝出黄色的警告?

两个注解来源

@Resource  于 2006年5月11日随着JSR 250 发布 

@Autowired  于 2007年11月19日随着Spring2.5发布,同时官方也对@Resource进行了支持。

@Autowired 是 Spring的亲儿子,而@Resource是Spring对它定义的一种实现。

@Autowired●类型注入

@Resource●名字注入优先,找不到名字找类型

大概的意思是:Spring虽然实现了两个功能类似的,但是存在概念上的差异或含义上的差异:

●@Resource 按名称给我一个确定已知的资源。

●@Autowired 尝试按类型连接合适的其他组件。

Both @Autowired and @Resource work equally well. But there is a conceptual difference or a difference in the meaning
●
@Resource means get me a known resource by name. The name is extracted from the name of the annotated setter or field, or it is taken from the name-Parameter.
●
@Inject or @Autowired try to wire in a suitable other component by type.
So, basically these are two quite distinct concepts. Unfortunately the Spring-Implementation of @Resource has a built-in fallback, which kicks in when resolution by-name fails. In this case, it falls back to the @Autowired-kind resolution by-type. While this fallback is convenient, IMHO it causes a lot of confusion, because people are

原来Spring官方说的“粒度”是指“资源范围”,@Resource找寻的是确定的已知的资源,相当于给你一个坐标,你直接去找。@Autowired是在一片区域里面尝试搜索合适的资源。

Spring为什么会支持两个功能相似的注解呢?

●它们的概念不同,@Resource更倾向于找已知资源,而Autowired倾向于尝试按类型搜索资源。

●方便其他框架迁移,@Resource是一种规范,只要符合JSR-250规范的其他框架,Spring就可以兼容。



既然@Resource更倾向于找已知资源,为什么也有按类型注入的功能?

●个人猜测:可能是为了兼容从Spring切换到其他框架,开发者就算只使用Resource也是保持Spring强大的依赖注入功能。

为什么@Autowired在属性上的时候Idea会曝出黄色的警告,并且推荐我们使用构造方法注入?

其实Spring文档中已经给出了答案,主要有这几点:



1.声明不了常量的属性

基于属性的依赖注入不适用于声明为 final 的字段,因为此字段必须在类实例化时去实例化。声明不可变依赖项的唯一方法是使用基于构造函数的依赖项注入。



2.容易忽视类的单一原则

一个类应该只负责软件应用程序功能的单个部分,并且它的所有服务都应该与该职责紧密结合。如果使用属性的依赖注入,在你的类中很容易有很多依赖,一切看起来都很正常。但是如果改用基于构造函数的依赖注入,随着更多的依赖被添加到你的类中,构造函数会变得越来越大,代码开始就开始出现“异味”,发出明确的信号表明有问题。具有超过十个参数的构造函数清楚地表明该类有太多的依赖,让你不得不注意该类的单一问题了。因此,属性注入虽然不直接打破单一原则,但它却可以帮你忽视单一原则。



3.循环依赖问题

A类通过构造函数注入需要B类的实例,B类通过构造函数注入需要A类的实例。如果你为类 A 和 B 配置 bean 以相互注入,使用构造方法就能很快发现。



4.依赖注入强依赖Spring容器

如果您想在容器之外使用这的类,例如用于单元测试,不得不使用 Spring 容器来实例化它,因为没有其他可能的方法(除了反射)来设置自动装配的字段。



为什么@Resource没有呢?

在官方文档中,我没有找到答案,查了一些资料说是:@Autowired 是 Spring 提供的,一旦切换到别的 IoC 框架,就无法支持注入了. 而@Resource 是 JSR-250 提供的,它是 Java 标准,我们使用的 IoC 容器应该和它兼容,所以即使换了容器,它也能正常工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值