当前位置: 首页 > 科技观察

@Autowired和@Resource有什么区别,你懂吗?

时间:2023-03-12 11:12:02 科技观察

阿凡相信大家做Java开发的一定对Spring非常熟悉,而在面试的时候,相信大家也能轻松知道Spring注入等所有关于Spring的面试题。你肯定会被问到@Autowired和@Resource哪个更合适。今天阿粉就来说说这个注入注解的区别。@Autowired@Autowired顾名思义就是自动组装,作用是去掉代码Java代码中的getter/setter和bean属性中的property。当然吸气剂要看个人需要。如果需要对外提供私有属性,则应保留私有属性。也有很多面试官喜欢问,你了解Spring的自动组装吗?其实问题也是这个注解,这个注解里面有几个属性是大家需要知道的。默认值no表示不使用自动组装,必须通过ref元素定义Bean依赖。byName是根据Property的名字自动拼装的。如果一个Bean的名称与另一个Bean中的Property名称相同,则该Bean会自动组装成Property。(表示按属性名自动组装,XML文件中Bean的id必须与类中的属性名相同)byType是根据Property的数据类型(Type)自动组装的,如果数据类型为一个Bean兼容另一个Bean中Property的数据类型,它是自动组装的。(XML文件中的Bean的id和类中的属性名可以不同,但??是Bean的类型必须只有一种。)构造函数类似于byType,根据byType方式自动组装构造函数参数的数据类型。(类中构造函数的参数必须与配置文件中的类型相同)autodetect(3.0版本不支持)如果Bean中有默认构造函数,则使用构造函数模式,否则使用byType模式。其实这些参数都说明了一件事。这个@Autowired注解是按照类型来组装的,也就是类型,它自带的是@Resource?@Resource官方的描述是一般用在类属性或者setter方法上,用来声明需要自动组装的属性。如果在Resource注解中指定了bean的名称,Spring只会根据注解中的bame属性找到合适的对象,然后进行组装。如果注解中没有指定名称,则先按类属性的变量名查找,如果还是找不到,则按类型查找。里面还有属性:name定义了name属性的值,只根据name值进行匹配。使用byName的自动注入策略定义type属性的值,只根据type值进行匹配。使用byType的自动注入策略如果你不指定,他会默认使用反射机制,使用byName的自动注入策略。那么面试官的问题来了,@Autowired和@Resource有什么区别?什么时候选择使用什么合适?@Autowired和@Resource的区别1.封装不同@Autowired是Spring提供的。@Resource由J2EE提供。即Java规范。2.默认的装配类型不同。@Autowired仅按类型组装。@Resource默认按名称组装。@Autowired默认按类型组装。默认情况下,必须要求依赖对象存在。如果要允许空值,可以将其required属性设置为false。如果要使用nameassembly,可以结合@Qualifier注解使用。默认是根据名字拼装的,可以通过name属性指定名字。如果不指定name属性,在字段上写注解时,默认使用字段名来搜索name。如果注解写在setter方法上,则默认使用属性名进行组装。当找不到与名称匹配的bean时,将按类型完成连接。但需要注意的是,如果指定了name属性,则只会按照name进行组装。那么我们选择哪一个最好呢?其实大家在开发的时候有没有注意到一个地方,就是IDEA有时候会把warningFieldinjectionisnotrecommended放在@Autowired注解上,虽然不是报错,但是确实是warning的存在。但是@Resource呢?其实很多人都说不清为什么。阿芬个人感觉@Autowired是Spring提供的。它是由特定IoC提供的特定注释,导致应用程序和框架之间的强绑定。一旦你切换到其他IoC框架就不能支持注入。而@Resource是Java自己提供的。它是一个Java标准。我们使用的IoC容器要与之兼容,这样即使更换了容器也能正常工作。那么为什么这么多人使用@Autowired注解呢?那么就只有两个字,简单,使用constructor或者setter注入需要多写一些业务无关的代码,很麻烦,而字段注入大大简化了他们。而且在大多数情况下,业务代码和框架是强绑定的,完全的松散耦合只是理想中的事情,牺牲敏捷性去过度追求松散耦合是得不偿失的。那么,你知道它们之间有什么区别吗?