IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> spring中关于@AutoWired注解&@Resource注解的区别 -> 正文阅读

[Java知识库]spring中关于@AutoWired注解&@Resource注解的区别

@AutoWired和@Resource注解的区别

参考网址1:https://blog.csdn.net/weixin_40423597/article/details/80643990

参考网址2:https://www.zhihu.com/question/39356740

两者的基本认识

1、@Autowired注解是Spring自己定义的注解 (Spring团队)

2、Spring框架还去实现了JSR-250(sun/oracle)规范定义的注解@Resource、@PostConstruct以及@PreDestroy。

在某种情况下:Spring实现的@Resource的作用相当于@Autowired

两者的区别

1、只不过@Autowired按byType自动注入、而@Resource默认按 byName自动注入罢了

@Resource

1、@Resource有两个属性是比较重要的,分是name和type,

2、Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,如下

@Resource(name="xxxxServiceImpl")
private UserService userService;

// 源码分析
if(name == 'userServiceImpl'){
    return beanfacotry.getBean("userServiceImpl")
}

3、而使用type属性时则使用byType自动注入策略。

@Resource(type=UserServiceImpl.class)
private UserService userService;

// 源码分析
if(type == UserServiceImpl.class){
    return beanfacotry.getBean(UserServiceImpl.class)
}

4、如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource //等价于 @Resource(name="xxxxServiceImpl")
private UserService userService;
// 源码分析
if(name == 'userServiceImpl'){
    return beanfacotry.getBean("userServiceImpl")
}

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

@Resource(name="xxxx",type=UserServiceImpl.class) 
private UserService userService;

// 源码分析
if(name == 'userServiceImpl' && type == UserServiceImpl.class){
    return beanfacotry.getBean("userServiceImpl")
}

总结:

1:默认情况 @Resource是根据byname匹配,如果一个接口在开发只有一个实现类,会自动把唯一的实现赋值给接口进行是实例化。这个时候这两者是等价的。
2: 如果@Resource指定的name就必须和sprignioc中的map的key名字要一摸一样。默认情况下,是使用类名首字母小写进行一定,否则报错
3: 如果@Resource指定的type,就必须是当前被注入的类的子类或者当前类,否则报错
4: 如果@Resource指定的type也指定了name,一种双重机制,只有有一个条件不满足就报错。

@Autowired

1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。

2、@Autowired:默认按类型装配(这个注解是属业spring的)

@Autowired(type=UserServiceImpl.class)
private UserService userService;

// 源码分析
if(type == UserServiceImpl.class){
    return beanfacotry.getBean(UserServiceImpl.class)
}

3、默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,

如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
    
@Autowired(required=false)
private UserService userService;

总结:

1: @Autowired默认是根据bytype来匹配,如果一个接口在开发只有一个实现类,会自动把唯一的实现赋值给接口进行是实例化。这个时候这两者是等价的。
2:@Autowired如果找不到子类,就报错NoBeanDefinitionException异常,如果要解决这个异常,在注解上增加required = false即可,但是这个接口或者类是不会被实例化,也就null
这里这个对象在掉用方法的时候就会出现nullponitexception异常。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-08 13:41:02  更:2021-12-08 13:41:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:41:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码