【Spring注解驱动开发】你还不会使用@Resource和@Inject注解?那你就out了!!
点击上方蓝色“冰河技术”,关注并选择“设为星标”
持之以恒,贵在坚持,每天进步一点点!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
https://github.com/sunshinelyz/mykit-delay
PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。
写在前面
我在 冰河技术 微信公众号中发表的《【Spring注解驱动开发】使用@Autowired@Qualifier@Primary三大注解自动装配组件,你会了吗?》一文中,介绍了如何使用@Autowired、@Qualifier和@Primary注解自动装配Spring组件。那除了这三个注解以外,还有没有其他的注解可以自动装配组件呢?那必须有啊!今天,我们就一起说说@Resource注解和@Inject注解。
关注 冰河技术 微信公众号,回复 “Spring注解”关键字领取源码工程。
@Resource注解
@Resource(这个注解属于J2EE的,JSR250),默认安照名称进行装配,名称可以通过name属性进行指定, 如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
@Resource注解的源码如下所示。
package javax.annotation;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {
String name() default "";
String lookup() default "";
Class<?> type() default java.lang.Object.class;
enum AuthenticationType {
CONTAINER,
APPLICATION
}
AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
boolean shareable() default true;
String mappedName() default "";
String description() default "";
}
@Inject注解
@Inject注解(JSR330)默认是根据参数名去寻找bean注入,支持spring的@Primary注解优先注入,@Inject注解可以增加@Named注解指定注入的bean。
@Inject注解的源码如下所示。
package javax.inject;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.Documented;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
@Target({ METHOD, CONSTRUCTOR, FIELD })
@Retention(RUNTIME)
@Documented
public @interface Inject {}
注意:要想使用@Inject注解,需要在项目的pom.xml文件中添加如下依赖。
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
项目案例
测试@Resource注解
首先,我们将项目中的PersonService类标注在personDao字段上的@Autowired注解和@Qualifier注解注释掉,然后添加@Resource注解,如下所示。
//@Qualifier("personDao")
//@Autowired(required = false)
@Resource
private PersonDao personDao;
接下来,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。
PersonService{personDao=PersonDao{remark='1'}}
可以看到,使用@Resource注解也能够自动装配组件,只不过此时自动装配的是remark为1的personDao。而不是我们在AutowiredConfig类中配置的优先装配的remark为2的personDao。AutowiredConfig类中配置的remark为2的personDao如下所示。
@Primary
@Bean("personDao2")
public PersonDao personDao(){
PersonDao personDao = new PersonDao();
personDao.setRemark("2");
return personDao;
}
我们在使用@Resource注解时,可以通过@Resource注解的name属性显示指定要装配的组件的名称。例如,我们要想装配remark为2的personDao,只需要为@Resource注解添加 name="personDao2"
属性即可。如下所示。
//@Qualifier("personDao")
//@Autowired(required = false)
@Resource(name = "personDao2")
private PersonDao personDao;
接下来,我们再次运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。
PersonService{personDao=PersonDao{remark='2'}}
可以看到,此时输出了remark为2的personDao,说明@Resource注解可以通过name属性显示指定要装配的bean。
测试@Inject注解
在PersonService类中,将@Resource注解注释掉,添加@Inject注解,如下所示。
//@Qualifier("personDao")
//@Autowired(required = false)
//@Resource(name = "personDao2")
@Inject
private PersonDao personDao;
修改完毕后,我们运行AutowiredTest类的testAutowired01()方法,输出的结果信息如下所示。
PersonService{personDao=PersonDao{remark='2'}}
可以看到,使用@Inject注解默认输出的是remark为2的personDao。这是因为@Inject注解和@Autowired注解一样,默认优先装配使用了@Primary注解标注的组件。
@Resource和@Inject注解与@Autowired注解的区别
不同点
-
@Autowired是spring专有注解,@Resource是java中 JSR250中的规范,@Inject是java中 JSR330中的规范 -
@Autowired支持参数required=false,@Resource,@Inject都不支持 -
@Autowired,和@Inject支持@Primary注解优先注入,@Resource不支持 -
@Autowired通过@Qualifier指定注入特定bean,@Resource可以通过参数name指定注入bean,@Inject需要@Named注解指定注入bean
相同点
三种注解都可以实现bean的注入。
重磅福利
关注「 冰河技术 」微信公众号,后台回复 “设计模式” 关键字领取《深入浅出Java 23种设计模式》PDF文档。回复“Java8”关键字领取《Java8新特性教程》PDF文档。回复“限流”关键字获取《亿级流量下的分布式限流解决方案》PDF文档,三本PDF均是由冰河原创并整理的超硬核教程,面试必备!!
好了,今天就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一起学习,一起进步!!
写在最后
如果你觉得冰河写的还不错,请微信搜索并关注「 冰河技术 」微信公众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技术,「 冰河技术 」微信公众号更新了大量技术专题,每一篇技术文章干货满满!不少读者已经通过阅读「 冰河技术 」微信公众号文章,吊打面试官,成功跳槽到大厂;也有不少读者实现了技术上的飞跃,成为公司的技术骨干!如果你也想像他们一样提升自己的能力,实现技术能力的飞跃,进大厂,升职加薪,那就关注「 冰河技术 」微信公众号吧,每天更新超硬核技术干货,让你对如何提升技术能力不再迷茫!
后记:
记住:你比别人强的地方,不是你做过多少年的CRUD工作,而是你比别人掌握了更多深入的技能。不要总停留在CRUD的表面工作,理解并掌握底层原理并熟悉源码实现,并形成自己的抽象思维能力,做到灵活运用,才是你突破瓶颈,脱颖而出的重要方向!
你在刷抖音,玩游戏的时候,别人都在这里学习,成长,提升,人与人最大的差距其实就是思维。你可能不信,优秀的人,总是在一起。。
扫一扫或长按二维码
关注冰河技术微信公众号
如果你喜欢这篇文章,欢迎点赞和转发。
生活很美好,明天见(。・ω・。)ノ♡
本文分享自微信公众号 - 冰河技术(hacker-binghe)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
新人手册系列:多面手之性能测试
阿里巴巴质量技术新人手册又更新了!本期分享的最常用的性能测试,买买买,也要服务器稳稳稳! 概念&目的 本周分享的性能测试,主要面向的是服务端的性能测试。 性能测试是从业务中提取压测模型,然后利用压测工具按照模型制造压测流量,并对目标应用集群进行施压,在施压过程中观察应用集群的性能表现和发掘性能瓶颈的测试行为。 当前性能测试主要分为线上压测和线下压测。线上压测主要通过全链路压测执行,线下压测是单机(或者小集群)压测。全链路压测请看全链路压测章节,本节主要讨论通用性能测试方案和流程。 常用指标 1. 虚拟用户 虚拟用户,模拟真实业务逻辑步骤的虚拟用户,虚拟用户模拟的操作步骤都被记录在压测脚本里。压测脚本用于描述虚拟用户在场景中执行的操作。 2. Transaction压测事务 事务是性能测试脚本的一个重要特性。要度量服务器的性能,需要定义事务,每个事务都包含事务开始和事务结束标记。事务用来衡量脚本中一行代码或多行代码的执行所耗费的时间。可以将事务开始放置在脚本中某行或者多行代码的前面,将事务结束放置在该行或者多行代码的后面,在该脚本的虚拟用户运行时,这个事务将衡量该...
- 下一篇
涨见识!Java String转int还有这种写法
之前我写了一篇《老师,你确定Java注释不会被执行吗》,结果文章在知乎小火了一把,将近 10 万人阅读。有爱装逼的同行批评说,标题夸大了;同时,也有很多初学者表示,涨见识了,之前从来不知道这个知识点,这下学到了。 必须得承认一点,我写的大多数技术文章都是针对初学者的,因为我觉得他们最需要帮助,这也是我一直坚持分享的初衷。 我也不喜欢写那些高深的文章,费时间耗精力,受众也小。就拿我们学过的古诗来说吧,“鹅鹅鹅,曲项向天歌”,“一去二三里,烟村四五家”,我就觉得挺好的。没必要都去搞阳春白雪,最后搞得曲高和寡,对吧? 那这次来分享一个新的知识点,我敢赌一包卫龙辣条(打钱来),很多同学不一定知道。 在 Java 中,String(字符串) 和 int(整形) 是两种不同的数据类型,字符串可以把许多字符串起来,整形嘛——就是整形了。 (同学们可能会疑惑,这个知识点我能不知道,别蒙我好不好?继续往下看呗。吃大餐之前,还能不来点小吃或者凉菜?) 有时候,字符串可以单纯包含一些数字,比如说“123”。大家应该都见过,当一些操作需要你输入手机验证码的时候,大部分要求输入的都是 6 位或者 4 位的随机数...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块