@Autowired 与@Resource选择
总结:推荐使用@Resource,如果追求速度,就使用@Resource指定名字(或者在注入接口的时候,强制指定实现类名)
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@Autowired 与@Resource的区别:
1、 @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、 @Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired()
@Qualifier(“baseDao”)
privateBaseDao baseDao;
3、@Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
推荐使用:@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。这样代码看起就比较优雅。
个人总结:
@Autowired 根据类型type注入,
@Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用,
@Autowired @Qualifie(“userService”) 两个结合起来可以根据名字和类型注入
@Resource 默认根据名字name注入,其次按照类型搜索,也可以通过name和type属性进行选择性注入
一般@Autowired和@Qualifier一起用,@Resource单独用。
当然没有冲突的话@Autowired也可以单独用
@Resource
默认情况下是按照名称进行匹配,如果没有找到相同名称的Bean,则会按照类型进行匹配,有人可能会想了,这下好了,用这个是万能的了,不用管名字了,也不用管类型了,
缺点:
根据这个注解的匹配效果可以看出,它进行了两次匹配,也就是说,如果你在UserService这个类上面这样写注解,@Service,它会怎么找呢,首先是找相同名字的,如果没有找到,再找相同类型的,而这里的@Service没有写名字,这个时候就进行了两次搜索,显然,速度就下降了许多。也许你还会问,这里的@Service本来就没有名字,肯定是直接进行类型搜索啊。其实不是这样的,UserServiceImpl 上面如果有@Service默认的名字 是这个userServiceImpl,注意看,就是把类名前面的大写变成小写,就是默认的Bean的名字了。一般开发都会自己指定名字,例如:userService
@Resource根据名字搜索是这样写@Resource(“userService”),如果你写了这个名字叫userService,那么UserServiceImpl上面必须也是这个名字,不然还是会报错。
@Autowired @Qualifie(“userService”)
是直接按照名字进行搜索,也就是说,对于UserServiceImpl 上面@Service注解必须写名字,不写就会报错,而且名字必须是@Autowired @Qualifie(“userService”) 保持一致。如果@Service上面写了名字,而@Autowired @Qualifie() ,一样会报错。
说了这么多,可能你有些说晕了,那么怎么用这三个呢,
要实际的工作是根据实际情况来使用的,UserServiceImpl上面可能会这样写 @Service(“userService”),这样通常使用AutoWire和@Resource多一些,bean的名字不用写。
这里的实际工作情况,到底是什么情况呢?
如果你的架构设计师考虑的比较精细,要求比较严格,要求项目上线后的访问速度比较好,这个时候@AutoWire没有@Resource好用,因为@Resource可以根据名字来搜索,是这样写的@Resource(name=“userService”),可以直接写@Resource(“userService”),因为默认byname。
为什么推荐@Resource(name=“userService”)???
因为根据名字搜索是最快的,就好像查数据库一样,根据Id查找最快。因为这里的名字与数据库里面的ID是一样的作用。这个时候,就要求你多写几个名字,工作量自然就增加了。而如果你不用注解,用xml文件的时候,对于注入Bean的时候要求写一个Id,xml文件时候的id就相当于这里的名字。
这个@Autowired @Qualifie(“userService”) 也可以用名字啊,为什么不用呢?
原因很简单,这个有点长,不喜欢,增加工作量。
说了那么多没用,你能做的就是简单直接,什么最方便就用什么,
你就直接用@Resource得了,如果你喜欢用@Autowire也行,不用写名字。
参考:@Autowired 与@Resource选择(治好你的强迫症)
@Autowired 与@Resource选择相关推荐
- Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...
- 综合技术 --@Autowired和@Resource
2019独角兽企业重金招聘Python工程师标准>>> 1.@Autowired和@Resource 的作用一样,都是自动注入 2.@Autowired是按照byType自动注入,而 ...
- Spring @Autowired和@Resource
@Autowired和@Resource 共同点:都是装配bean的注解 不同点: @Autowired 提供者:@Autowired是Spring提供的注解 装配方式:ByType(通过类的类型)装 ...
- @AutoWired和@Resource注解异同分析
相同点: @AutoWired和@Resource注解都是从Spring容器中取出相应的bean对象,自动装配. 不同点: @AutoWired: 默认根据类型进行自动装配,依赖的对象必须存在,如果允 ...
- Spring框架在属性注入时@Autowired和@Resource的区别
相同点: @Autowired和@Resource都可以进行引用类型属性的注入 不同点: 属性的依赖注入有两种方式: "byName":根据名称自动装配,引用数据类型bean的id ...
- 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject
目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...
- 请谈一下@Autowired 和@Resource区别是什么?
请谈一下@Autowired 和@Resource区别是什么? 共同点: 两者都可以加在属性和setter方法上面,如果都写在属性上,那么就不需要再写setter方法. 不同点: ① @Autowir ...
- @Autowired和@Resource注解的区别?
谈到Spring的注解,@Autowired和@resource这两个注解不得不提.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上 那@A ...
- Spring系列(十):@Autowired 和@Resource注解用法介绍
今天给大家分享Spring属性注入的注解@Autowired 和@Resource介,希望对大家能有所帮助! 一.@Autowired 注解 1.1 介绍 @Autowired注解默认按照类型容器中找 ...
- Spring中@Autowired和@Resource的区别
一.定义 @Autowired 对类成员变量.方法及构造函数进行标注,完成自动装配的工作. @Resource 在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关. 如 ...
最新文章
- Java项目:实现权限管理系统(java+SpringBoot+MyBatis+AOP+LayUI+Mysql)
- smartsql和mysql_SmartSql 常见问题
- [SOJ] 畅通工程续
- fasta文件中DNA to RNA
- iOS14更新了需要注意哪些适配
- laravel-echo-server 不接收失败_6所高校公布报名不合格名单!这些问题最容易出错...
- 深入浅出 Cocoa 之 Core Data(3)- 使用绑定
- ac3168无线网卡驱动下载_70块的笔记本网卡,值不值得换
- pygame 鼠标事件
- 优动漫PAINT画面上色技巧——渐变映射
- 什么是重载?有什么作用?
- 小码哥php教程,小码哥Java从0到高级工程师
- 基于anyrtc的sdk实现直播连麦互动
- 实在智能签约上海联通,共创美好智慧生活
- Java实现图片的镜像处理
- 英特尔 超核芯显卡 620mac_显卡性能翻倍,AI能力加持:英特尔发布10代酷睿处理器...
- 长高不仅靠遗传,让孩子再次长高的秘诀都在这
- Skywalking环境搭建及demo实战
- matlab cft结果导出,补体结合试验(CFT)
- open falcon 监控php,小米监控系统open-falcon安装