java resource和,java_spring之Autowired与Resource差异解析
spring中比较容易混淆的是Resource和Autowired,特此做下区分。
Resource:j2ee的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。
Autowired:spring注解,默认是以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,无论要注入的 bean 的 name 是什么;如果匹配到多个,就会调用 DefaultListableBeanFactory 的 determineAutowireCandidate 方法来决定具体注入哪个bean。
determineAutowireCandidate 方法的逻辑是:1
2
3先找 Bean 上有@Primary 注解的,有则直接返回 bean 的 name。
再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回 bean 的 name。
最后再以名称匹配(ByName)的方式去查找相匹配的 bean。
可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。1还有一点要注意:如果使用了 @Qualifier 注解,那么当自动装配匹配到多个 bean 的时候就不会进入 determineAutowireCandidate 方法(亲测),而是直接查找与 @Qualifer 指定的 bean name 相同的 bean 去注入,找到了就直接注入,没有找到则抛出异常。
@Autowired与@Resource异同:1
2
31、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
3、@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。
问题:Spring的@Autowired加到接口上但获取的是实现类?1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20/* 类 @Controller注解,会在spring容器中实例化对象 */
@Controller
public class UserContoller{
@Autowired// 先按类型找,然后按id为属性名去找
private UserService userService;
//为什么他会拿到userServiceImpl?
// @Autowired会帮你按UserService的类型去容器中找唯一bean对象
// 1、容器没有该类型的对象:报错
// 2、容器中有该类型的唯一bean对象,就将该唯一bean对象赋值给该属性
///3、容器中有多个【两个及以上】该类型的唯一bean对象,
// 它会再根据该属性名去容器中找,
// 看看容器中的哪个bean对象的id值和该属性名一致,
// 如果有,就将容器中该对象赋值给该属性,如果没有报错。
}
/* 接口 */
public interface UserService{}
/* 类 @Service注解,会在spring容器中实例化对象 */
@Service
public class UserServiceImpl implements UserService{}
@Autowired先按类型找,然后再按id为属性名去找
他会帮你按UserService的类型去容器中找唯一bean对象
容器没有该类型的对象:报错
容器中有该类型的唯一bean对象,就将该唯一bean对象赋值给该属性
容器中有多个【两个及以上】该类型的唯一bean对象,
它会再根据该属性名去容器中找,
看看容器中的哪个bean对象的id值和该属性名一致,
如果有,就将容器中该对象赋值给该属性,如果没有报错。
然后通过多态的向上转型就赋值成功。等价于之前手动赋值1UserService userService = new UserServiceImpl();
问题:同一类型拥有多个实现类的时候,如何注入呢?
答:这种场景下,只能通过 byName 注入的方式。可以使用 @Resource 或 @Qualifier 注解。
问题:如果没有指定Spring创建的bean的名称,会怎么注入呢?
(1)默认名为类名,但首字母小写,如:UserService类,创建的bean的name为userService
(2)如果类名前两个或以上字母都为大写,那么bean的名字就是类名,如:TUserService类,默认创建的bean的name为TUserService
@Required 注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常
java resource和,java_spring之Autowired与Resource差异解析相关推荐
- Java面试--autowired和resource区别
面试题:autowired和resource有什么区别(百度面试题) autowired和resource有什么区别 @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会 ...
- Java 中 @Autowired与@Resource的区别
1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...
- Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法
一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...
- Spring中@Autowired和@Resource区别
Spring可以基于注解方式配置并注入依赖.在Java代码中使用@Resource或者@Autowired注解方式注入. 1. @Resource: 1)默认按照名称装配注入,只有当找不到与名称nam ...
- 在方法的形参位置使用@Qualifier注解||@Autowired 与@Resource的区别
实验21:在方法的形参位置使用@Qualifier注解 实验22:@Autowired注解的required属性指定某个属性允许不被设置 @Autowired @Resource @Inject ...
- 【Spring注解系列13】Spring自动装配总结:@Autowired、@Resource、@Qualifier、@Inject
目录 1.@Autowired.@Resource.@Qualifier.@Inject 1).@Autowired 2).@Resource与@Inject 3). @Autowired参数取值 2 ...
- @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 在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关. 如 ...
最新文章
- 宇宙是一个图网络?「全球最聪明的人」刚刚为物理基础理论指出了全新道路...
- [Android] DiffUtil在RecyclerView中的使用详解
- python处理excel的工具-基于Python的Excel处理工具
- Mdadm 设置管理
- 使用Ubuntu 12.04作为日常电脑环境
- 加州无人车报告出炉,苹果表现垫底,国产车进前五
- CentOS6中安装、配置、启动GitLab以及遇到的那些坑
- 基于SuperSocket的IIS主动推送消息给android客户端
- LeetCode-260 Single Number III
- 集合框架(去除ArrayList集合中的重复字符串元素案例2)
- python中定义的类的方法调用老出现missing 1 postional argument 或者self的解决办法
- 设计模式——装饰模式和代理模式
- ENVI计算不同轨道号范围中的平均高程
- fprintf用法解析
- 实验六 卷积神经网络(4)ResNet18实现MNIST
- 24券创始人杜一楠的失败检讨书:我的“孩子”是如何死去的?
- 全美 计算机专业排名,全美计算机专业排名
- EasyExcel锁定指定单元格 禁止表格复制
- 实现SSO单点登录的思考
- MATLAB读json文件
热门文章
- 你正在学 Web 自动化测试?Selenium 基本操作你了解嘛? | 原力计划
- 半小时训练亿级规模知识图谱,亚马逊这个 AI 框架要火!
- 李彦宏:百度今年全员涨薪,比去年还多;谷歌暂停Chrome浏览器更新;Eclipse 4.15发布 | 极客头条...
- 终于!孙宇晨和巴菲特吃上 3153 万元的晚餐,还送了一个比特币!
- 如何降低前端代码圈复杂度?
- 乔纳森离开苹果;李彦宏被泼水;Windows 公开 Linux 内核源代码 | 开发者周刊
- @程序员,2019 年软件开发新趋势必知!
- 5G 登上“神坛”,区块链裁员求生!
- 女神节 | 那些奋斗在 IT 领域的“女神”们
- 日本要向中国收二维码使用费?每人一分钱?