自动注入@Autowired与@Resource区别详解

一、前言

@Autowired和@Resource都是用来自动装配bean的。

  • @Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。
  • @Autowired功能非常强大,但只适用于Spring框架,如果换成了JFinal等其他框架,功能就会失效。

Spring Bean覆盖配置

spring:
  main:
    allow-bean-definition-overriding: true

allow-bean-definition-overriding属性用于配置出现相同名称bean的情况如何处理:

  • 值为false时(默认值为false),如果出现相同名称的bean,直接抛异常。
  • 值为true时,表示支持相同名称的bean覆盖,后定义的bean会覆盖之前定义的相同名称的bean。

下文会提到按类型装配,那么什么是同一类型呢?

  • 父类及其子类,都属于父类这一类型。
  • 接口及其实现类,都属于接口这一类型。

二、@Autowired

@Autowired是Spring提供的注解,用于自动装配。

注解处理器
AutowiredAnnotationBeanPostProcessor类是Autowired注解的注解处理器。

关于注解处理器可参考文章: https://blog.csdn.net/JokerLJG/article/details/123548694

装配方式

  • 按类型装配(默认使用的装配方式)。
  • 按名称装配(结合@Qualifier注解使用)。

注解属性
required:默认值true。值为true时,表示必须注入,如bean不存在则会报错;值为false时,表示bean存在就注入,不存在则不注入。
作用范围

  • @Autowired的作用范围:成员变量、构造器、方法、参数、注解。

1. 成员变量

@Service
public class UserService {

    @Autowired
    private IUser user;
}

使用最多的方式。

2. 构造器

@Service
public class UserService {

    private IUser user;

    @Autowired
    public UserService(IUser user) {
        this.user = user;
    }
}

构造器上使用Autowired注解,实际上还是使用了成员变量装配的方式,并非构造器装配。

3. 方法

@Service
public class UserService {

    @Autowired
    public void test(IUser user) {
       user.test();
    }
}

Spring会在项目启动的过程中,自动调用一次加了@Autowired注解的方法,我们可以在该方法做一些初始化的工作。

4. 参数

在构造器的入参上加Autowired注解

@Service
public class UserService {

    private IUser user;

    public UserService(@Autowired IUser user) {
        this.user = user;
        System.out.println("user:" + user);
    }
}

在非静态方法的入参上加Autowired注解

@Service
public class UserService {

    public void test(@Autowired IUser user) {
       user.test();
    }
}

5. 注解

略。

使用技巧
同一类型多个bean
当按类型装配时,如果该类型的bean不止一个时,会直接报错。举例说明:

接口:

public interface IUser {
    void test();
}

实现类1:

@Service
public class User1 implements IUser{
    @Override
    public void test() {
    }
}

实现类2:

@Service
public class User2 implements IUser{
    @Override
    public void test() {
    }
}

自动装配:

@Service
public class UserService {

    @Autowired
    private IUser user;
}

启动时的错误信息:

Field userService in com.joker.controller.UserController required a single bean, but 2 were found:
	- userServiceImpl1: defined in file [D:\work\my\springboot\target\classes\com\joker\controller\UserServiceImpl1.class]
	- userServiceImpl2: defined in file [D:\work\my\springboot\target\classes\com\joker\controller\UserServiceImpl2.class]

@Primary的使用
@Primary注解可以解决上述问题(按类型装配时,如果该类型的bean不止一个时,会报错)。

当我们使用自动配置的方式装配Bean时,如果这个Bean有多个候选者,假如其中一个候选者具有@Primary注解修饰,该候选者会被选中,作为自动装配的bean。

在上面代码不变的情况下,只需在User1或User2上加@Primary注解,此时@Autowired自动装配会成功,并且自动装配的是加了@Primary注解的这个类对应的bean。

User1类加@Primary注解

@Service
@Primary
public class User1 implements IUser{
    @Override
    public void test() {
    }
}

@Qualifier的使用
通过@Autowired和@Qualifier的结合使用可以按名称装配。

@Service
public class UserService {

    @Autowired
    @Qualifier("user1")
    private IUser user;
}

自动装配名称为user1的bean(注意:bean的类型也必须要满足为IUser类型)。

装配多个实例
我们一般使用的都是用@Autowired自动装配单个实例,但其实它也可以用来装配多个实例。可以通过List、Set、Map来装配多个实例,如下:

@Service
public class UserService {

    @Autowired
    private List<IUser> userList;

    @Autowired
    private Set<IUser> userSet;

    @Autowired
    private Map<String, IUser> userMap;
}

上面的装配方式会吧IUser类型的多个实例bean都装配的List、Set、Map中。

@Autowired装配未生效
下面列举常见@Autowired装配未生效的情况:

@Autowired所在类未加@Controller、@Service、@Component、@Repository等注解,或者或者一些其它情况(如直接new对象的到实例)。这些情况会导致该类的bean并没有交给spring容器去管理,spring就无法完成自动装配的功能。

public class UserService {

    @Autowired
    private IUser user;

    public void test() {
        user.say();
    }
}

注解未被@ComponentScan扫描到。

三、@Resource

@Resource是JDK自带的注解,用于自动装配。

注解处理器
CommonAnnotationBeanPostProcessor类是Resource的注解处理器。

装配方式
@Resource默认按照名称自动注入。

既没指定name,也没指定type,自动按照名称装配(当注解写在字段上时,默认取字段名,当注解写在setter方法上时,默认取属性名进行装配。);如果没有匹配,则退而按照类型装配,找不到则抛出异常。

如果没有指定 name 属性,

如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

注解属性
Resource注解的主要属性:

name:指定需注入的bean的名称
type: 指定需注入的bean的类型
作用范围
@Resource的作用范围:类、成员变量、方法。

1. 成员变量

@Service
public class UserService {

    @Resource
    private IUser user;
}

2. 方法

@Service
public class UserService {

    @Resource
    public void test(IUser user) {
        user.test();
    }
}

  1. 略。

四、@Autowired与@Resource对比

二者对比
@Autowired @Resource
Spring定义的注解 JSR-250定义的注解
默认按类型自动装配 默认按名称自动装配
一个参数:required(默认true),表示是否必须注入 七个参数:最重要的两个参数是name、type
默认按类型自动装配
如果要按名称自动装配,需要使用@Qualifier一起配合 默认按名称自动装配
如果指定了name,则按名称自动装配;如果指定了type,则按类型自动装配
作用范围:构造器、方法、参数、成员变量、注解 作用范围:类、成员变量、方法
@Autowired装配流程
在这里插入图片描述

@Resource装配流程

在这里插入图片描述

见习宇航员_
关注 关注
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Autowired与@Resource区别
m0_67265464的博客
07-27 1389
Autowired和@Resource都是用来自动装配bean的。@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。@Autowired功能非常强大,但只适用于Spring框架,如果换成了JFinal等其他框架,功能就会失效。
@Autowired与@Resource原理知识点详解
Park33的博客
05-23 527
AOP的不多做赘述了,说下IOC:Spring IOC 解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系,而IOC有两个概念:控制反转及依赖注入。控制反转指的就是:把原有自己掌控的事交给别人去处理,更多的是一种思想或者可以理解为设计模式。而依赖注入其实是控制反转的实现方式,通过依赖注入对象无需自行创建或者管理它的依赖关系,依赖关系将被自动注入到需要它们的对象当中去。
SpringBoot注解篇之@Resource与@Autowired
weixin_36808034的博客
10-12 3589
大家好,我是AK,最近在整理Java相关技术知识体系化;本篇主要介绍@Resource 注解和 @Autowired区别以及使用,适合学习spring框架小伙伴了解学习。
@Autowired和@Resource区别 详细讲解-包含面试题
最新发布
小电玩
09-19 938
AutowiredSpring 框架提供的一个注解,它简化了依赖注入的过程。通常情况下,当我们需要让一个类使用另一个类的功能时,我们可以在前者中声明后者的一个实例。使用@Autowired注解后,Spring 容器会在运行时自动将合适的实例注入到声明了该注解的成员变量或构造函数中。
@Autowired和@Resource区别
希望大家一起快乐的学java
08-07 483
区别 @Autowired(注解是属于spring的)按byType(类型装配)自动注入 依赖对象必须存在,如果要允许null值,可以设置它的required属性为false @Autowired(required=false), 它也可以使用名称装配,配合@Qualifier注解 @Resource(注解是属于J2EE的)默认按byName(名称装配)自动注入,也可以按类型装配 @Resourc...
Spring 注解 @Resource和@Autowired
九天之凤
05-08 415
@Resource和@Autowired两者都是做bean的注入使用。 其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入。但是Spring支持该注解的注入。 共同点:两者都可以写在字段和setter方法上。两者如果都写在字段上,就不需要写写setter方法。 不同点如下: 先来说一说@Autowired
@Autowired 与@Resource区别?
qq_28710139的博客
11-28 169
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用t...
详解Spring依赖注入:@Autowired,@Resource和@Inject区别与实现原理
08-25
Spring 依赖注入:@Autowired,@Resource 和@Inject 区别与实现原理 Spring 依赖注入是指在应用程序中将对象之间的依赖关系自动装配的过程。Spring 框架提供了多种依赖注入方式,包括 @Autowired、@Resource 和@...
详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决
08-25
SpringBoot 多线程处理任务中无法@Autowired注入bean问题解决 在 SpringBoot 应用程序中,多线程处理任务是一个常见的场景,但是,在多线程处理任务中无法使用 @Autowired 注入 bean,这是一个常见的问题。今天,...
详解Spring注解--@Autowired、@Resource和@Service
08-30
Spring注解详解 -- @Autowired、@Resource和@Service Spring框架中有三个非常重要的注解,即@Autowired、@Resource和@Service。这三个注解都是Spring框架中最常用的注解,它们都是用于解决Spring框架中的依赖注入...
注解@Autowired和@Resource区别总结
weixin_45985053的博客
07-26 1266
可用于构造函数,成员变量以及set方法从Spring4.3开始,如果目标Bean只有一个构造函数,则在该构造函数上可以省略@Autowired注解;如果目标Bean有多个构造函数则不可省略@Autowired注入方式按照type查找bean,如果使用@Qualifier注解声明了name,则从结果集中取出与该name相匹配的bean返回(此时可以视为通过name和type获取bean,但实质是先通过type获取所有bean,然后通过name筛选,详情见后文方法源码分析)如果没有使用字段名或。...
@Autowired 和 @Resource区别
syg1207的博客
05-07 1240
详细介绍了@Autowired 和 @Resource区别
@Autowired 和 @Resource区别
qq_39989608的博客
01-24 4509
1.@AutowiredSpring的,@Resourcejavax包下的。 2.@Autowired默认按类型匹配,@Resource默认按名称匹配 3.@Autowired默认按类型匹配, spring容器中没有该类型的bean,报NoSuchBeanDefinitionException 有一个,注入找到的bean spring容器中有多个该类型的bean。若@Autowired作用在字段上,用字段名去匹配,若匹配成功注入,否则报NoUniqueBeanDefinitionException。若
@Autowired和@Resource区别
zw1_csdn的博客
09-18 1105
用途:做bean的注入时使用历史:@Autowired 属于Spring的注解             org.springframework.beans.factory.annotation.Autowired    @Resource  不属于Spring的注解,JDK1.6支持的注解   javax.annotation.Resource共同点:   装配bean...
写文章

热门文章

  • 在内存管理中,“内零头”和“外零头”个指的是什么? 3214
  • 关于 Visual Studio 无法卸载/无法下载/无法更新的解决办法 3118
  • 2003 -Can t connect to MySQL server on localhost (10061 “Unknown error“)的解决方法 2307
  • pring-boot-starter-parent下面的版本报红 2179
  • 【数据结构】哈夫曼树及哈夫曼编码实现 1971

最新评论

  • 关于 Visual Studio 无法卸载/无法下载/无法更新的解决办法

    sky0149: 我在成都,以上都没用,就不懂为什么卸载要先更新才能卸载

大家在看

  • vSphere-基础理论和ESXI基础使用 1207
  • 【星闪开发连载】WS63E模块的雷达功能浅析 627
  • 基于开源AI智能名片2+1链动模式S2B2C商城小程序的顾客消费记录价值转化深度研究
  • Claude的---电脑控制---功能 113
  • 加权 K-NN 141

最新文章

  • Leetcode131.分割回文串
  • 【数据结构】哈夫曼树及哈夫曼编码实现
  • 详解JVM 的垃圾回收算法和垃圾回收器
2023年3篇
2022年12篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家铜仁人物玻璃钢雕塑图片汕尾美陈玻璃钢雕塑玻璃钢现代抽象雕塑一件代发四川超市商场美陈供应商德州卡通玻璃钢雕塑价格曲阳玻璃钢新娘雕塑艺术商场美陈销售厂家山西抽象玻璃钢造型雕塑制作黑龙江玻璃钢仿真水果雕塑价格玻璃钢雕塑材料原料上海特色商场美陈生产厂家清远玻璃钢雕塑别具风韵南瓜玻璃钢雕塑多少钱水果玻璃钢雕塑销售电话商场美陈气球造型东营玻璃钢人物雕塑厂家供应漯河价值观玻璃钢景观雕塑厂家黑龙江玻璃钢雕塑生产厂家桂平玻璃钢雕塑公司邯郸商业街玻璃钢雕塑广东树脂玻璃钢雕塑鹅型设计郑州童彩玻璃钢雕塑定制沈抚新区玻璃钢雕塑厂家禅城玻璃钢雕塑制品新民玻璃钢动物雕塑七台河玻璃钢卡通雕塑广东能透光玻璃钢雕塑黑龙江特色玻璃钢雕塑联系方式玻璃钢卡通动漫雕塑厂云南卡通玻璃钢造型雕塑制作香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化