首页 > 其他分享 >@Autowired和@Resource到底什么区别,你明白了吗?

@Autowired和@Resource到底什么区别,你明白了吗?

时间:2022-09-28 16:38:58浏览次数:48  
标签:装配 Resource name 区别 Autowired 注解 属性

大家做 Java 开发的,肯定对于 Spring 是非常熟悉的,而且面试的时候,也相信大家能够非常轻易的知道这个所有的关于 Spring 的面试题,比如 Spring 的注入什么的。也肯定会被问到 @Autowired 和 @Resource 到底用哪个比较适合,今天就来讲讲这个注入的注解是个什么区别。


@Autowired

@Autowired顾名思义,就是自动装配,而它的作用是为了消除代码Java代码里面的 getter/setter 与 bean 属性中的 property 。


当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。


也有很多面试官喜欢询问,Spring 的自动装配你了解么?其实问的也是这个注解,而这个注解中有几个属性,需要大家知道。


no

默认值,表示不使用自动装配,Bean 依赖必须通过 ref 元素定义。


byName

根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相同,则自动装配这个 Bean 到 Property 中。(表示按属性名称自动装配,XML 文件中 Bean 的 id 必须与类中的属性名称相同)


byType

根据 Property 的数据类型(Type)自动装配,如果一个 Bean 的数据类型兼容另一个 Bean 中 Property 的数据类型,则自动装配。(XML 文件中 Bean 的 id 与类中的属性名称可以不同,但必须只有一个类型的 Bean。)


constructor

类似于 byType,根据构造方法参数的数据类型,进行 byType 模式的自动装配。(类中构造函数的参数必须在配置文件中有相同的类型)


autodetect(3.0版本不支持)

如果 Bean 中有默认的构造方法,则用 constructor 模式,否则用 byType 模式。


其实这些参数都指明了一件事情,这个 @Autowired 的注解,就是根据 type 也就是类型来进行装配,与之而来的就是 @Resource 他又是什么呢?


@Resource

官方描述为,一般用在类属性或者setter方法上声明属性需要自动装配。


如果在Resource注解中指定了bean的名称,则Spring会只按注解中的bame属性查找合适对象,然后进行装配。如果注解中没有指定名称,先按类属性的变量名查找,如果还是未找到,则按类型进行查找。


它的内部也有属性:


name

定义了name属性的值, 就只按照name值匹配,使用byName的自动注入策略


type

定义了type属性的值, 就只按照type值匹配,使用byType的自动注入策略


如果你不指定的话,他自己会默认使用反射机制,使用byName自动注入策略。


那么面试官的问题就来了,@Autowired 和 @Resource 的区别在哪呢?什么时候选择用什么才合适呢?


@Autowired 和 @Resource 的区别

1.包就不一样

@Autowired 是Spring提供的。


@Resource 是J2EE提供的。也就是Java规范的。


2.装配的默认类型不一样

@Autowired只按type装配。


@Resource默认是按name装配。


@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。


如果想使用名称装配可以结合@Qualifier注解进行使用。


而默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。


如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。


那么我们选择哪一种最好呢?


其实大家在开发的时候,有没有注意到一个地方,就是 IDEA 有时候还会在 @Autowired 注解上面Field injection is not recommended (字段注入是不被推荐的)这个警告,虽然并不属于报错,但是确实是警告的存在。但是 @Resource 就不会呢?


其实有很多人也说不上来为啥,阿粉个人感觉,@Autowired是Spring提供的,它是特定IoC提供的特定注解,这就导致了应用与框架的强绑定,一旦换用了其他的IoC框架,是不能够支持注入的。


而 @Resource是 Java 自己提供的,它是Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。


那么为什么还有这么多的人使用的都是 @Autowired 注解呢?


那就只有两个字了,简单,使用构造器或者setter注入需要写更多业务无关的代码,十分麻烦,而字段注入大幅简化了它们。并且绝大多数情况下业务代码和框架就是强绑定的,完全松耦合只是一件理想上的事,牺牲了敏捷度去过度追求松耦合反而得不偿失。


所以,你知道他们的区别是什么了么?

标签:装配,Resource,name,区别,Autowired,注解,属性
From: https://blog.51cto.com/u_15773567/5715445

相关文章

  • 翻了ConcurrentHashMap1.7 和1.8的源码,我总结了它们的主要区别。
    ConcurrentHashMap思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独......
  • 标准化和归一化的区别
    一、是什么?1. 归一化是为了将数据映射到0~1之间,去掉量纲的过程,让计算更加合理,不会因为量纲问题导致1米与100mm产生不同。 归一化是线性模型做数据预处理的关......
  • localStorage和sessionStorage的区别和使用方法。
    一、localStorage和sessionStorage的相同点它们的储存大小都是5M;它们都用于存储客户端数据;它们都只能存储字符串数据;二、localStorage和sessionStorage的区别1.是否......
  • Spring Resource和策略模式应用
    Spring把所有能记录信息的载体,如各种类型的文件、二进制流等都称为资源,对Spring开发者来说,最常用的资源就是Spring配置文件(通常是一份XML格式的文件)。在Sun所提供......
  • [数组和链表的区别]
    [数组和链表的区别]数组'''数组插入数据因为需要连在一起,如果内存空间不连续就得全体迁移,甚至出现内存空间足够但是由于不在一起而导致无法为数组分配内存。'''链......
  • 工业软件和消费级软件的区别是什么?
    工业软件是对工业研发设计、生产制造、经营管理、服务等全生命周期环节规律的模型化、代码化、工具化,是工业知识、技术积累和经验体系的载体,是实现工业数字化、网络化、智......
  • HTTP、TCP、UDP以及SOCKET之间的区别/联系
    原文:https://zhuanlan.zhihu.com/p/433976897https://blog.csdn.net/weixin_33465519/article/details/124055757TCP/IP代表传输控制协议/网际协议,指的是一系列协议。可......
  • Java的try-resource
    原来是这个,这个是之前的trycatch,包括最后进行关流等操作。privateStringgetBodyString(finalServletRequestrequest)throwsIOException{StringBuilder......
  • 车辆路口停车时,压线停车、越线停车与闯红灯的区别
    有车一族(尤其是新手),很容易忽略一个问题:车子到达红绿灯路口时未及时刹住车,有些车主往往会干脆一脚油门快速通过,其实这样做是最不合理的,扣的分也是最多的。那么,应该怎样做才......
  • Redis的持久化方式RDB和AOF的区别
    1.概论使用到Redis做缓存,方便多个业务进程之间共享数据。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数......