@Resource 注解的作用【和 @Autowired 的对比】

本文详细对比了@Resource、@Autowired和@Inject三个注解在Java应用中的使用方式与区别。@Resource和@Autowired分别代表JavaEE和Spring框架下的依赖注入,而@Inject则由JSR-330提供。文章通过实例讲解了它们的注入依据、使用场景及如何解决注入冲突。

今天看到一段代码使用的是 @Resource 的注解,的确是第一次看到这个注解,百度一查才知道,原来和 @Autowired 效果一样,但也有一定的区别。

      两个注解都可以用来注入 bean ,@Resource 是 JavaEE 的注解,@Autowired是Spring的注解,他俩都可以写在属性名上, setter方法上,@Autowired 还可以写在普通方法上,构造器上,而且两者注入的依据有点不同 :

1 . @Autowired 默认是按照类型进行装配的,而且默认要求被注入的 bean 必须存在,如果允许不存在的话,必须加上 required = false 的属性,(如果被类型匹配上的 Bean 有多个,会报异常,解决方案可以使用 @Primary 注解 , 或者指定 Bean 的名字)如:

@Autowired(required=false)
private UserDao userDaoImpl;

如果想要根据 bean 的 name 来进行装配,则需要指定 @Qualifier(“bean名字”),如:

@Autowired
@Qualifier("userDaoImpl")
private UserDao userDaoImpl;

但是如果需要使用 @Autowired 和 @Qualifier 两个注解来注入 Bean , 还不如使用下面的 @Resurce 呢 .

2 . @Resource 默认是按照名字进行装配的,不指定 bean 名字时会自动根据属性名进行注入,当找不到默认的名字的bean时就会根据类型去注入;但是如果指定了 name 属性,则按照指定的 bean 的 name进行注入,不会再根据类型去注入了,如:

//默认按属性名注入
@Resource
private UserDao userDaoImpl;


//按照指定的 bean的 name注入
@Resource(name="userDaoImpl")
private UserDao userDaoImpl

       后来我又看到了一个用于注入 Bean 的注解 , @Inject , 它是 JSR-330 提供的注解 , 这个注解在 Struts2 中使用的比较多 , 使用方法和 @Autowired 差不多 , 也是按照类型进行注入的 .

 

 

 

 

 

1

转载于:https://www.cnblogs.com/daimajun/p/7150075.html

<think>首先,用户查询是关于Spring框架中的@Autowired@Resource注解作用对象对比。用户明确引用了三个站内引用,我需要基于这些引用系统指令来回答。 关键点来自引用: - 引用[1]:两个注解都可以用来注入bean。@ResourceJavaEE的注解@Autowired是Spring的注解。它们都可以写在属性名上、setter方法上。@Autowired还可以写在普通方法上、构造器上。 - 引用[2]:如果声明在字段上,就不需要写setter方法,本质上还是通过set方法注入。区别:@Autowired默认通过byType注入,@Resource默认通过byName注入。@Autowired需要IOC容器中存在bean,除非指定required=false。 - 引用[3]:@Resource不是Spring的注解,来自javax.annotation.Resource,但Spring支持它。 用户的问题焦点是“作用对象的对比”,意思是这些注解可以应用在哪些地方(如字段、方法等)。 从引用中提取作用对象的区别: - @Resource:可以写在属性名上(字段)、setter方法上。 - @Autowired:可以写在属性名上(字段)、setter方法上、普通方法上、构造器上。 我的回答需要结构化: - 系统指令要求回答结构清晰,逐步解决问题。 - 使用中文回答。 - 所有行内数学表达式用$...$,但这里不涉及数学,所以可能不需要。 - 独立公式用$$...$$,但同样不相关。 - 生成相关问题。 - 在引用的相关信息末尾自然地添加引用标识。 回答结构: 1. **介绍**:简要说明两个注解的用途。 2. **对比作用对象**:详细列出每个注解可以应用的场景。 - 使用列表或表格清晰对比。 - 基于引用信息。 3. **其他区别的概述**:简要提到注入方式来源区别,因为用户焦点是作用对象,但引用中也包含了这些信息。 4. **总结**:强调关键差异。 5. **生成相关问题**:在最后添加相关问题。 确保引用标识: - 每当引用信息时,在末尾添加 [^1], [^2], 或 [^3],但要自然。 用户指令:"参考站内引用",所以我应该主要基于这些引用,但保持真实可靠。引用[1]来自用户上一段,引用[2][3]是新的。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题你的回答。" 用户上一次的问题是关于这两个注解作用对象对比,我需要专注于此。 最终回答计划: - 开头:直接切入主题。 - 主体:对比作用对象: - @Autowired 可以用于字段、setter方法、普通方法、构造器 [^1]。 - @Resource 可以用于字段、setter方法 [^1][^2]。 - 简要提及其他区别: - 来源:@Autowired是Spring特有,@ResourceJavaEE标准 [^1][^3]。 - 注入方式:@Autowired默认byType,@Resource默认byName [^2]。 - 结尾:总结差异,并生成相关问题。 生成相关问题: - 系统指令要求生成相关问题。 - 例如:如何选择使用哪个注解?在哪些场景下推荐使用@Autowired@Resource? 相关问题示例: 1. @Autowired @Resource 在注入方式上有什么区别? 2. 在Spring项目中,推荐使用@Autowired还是@Resource? 3. 如何处理当多个bean候选时@Autowired@Resource的行为? 保持中文。 </think>### @Autowired @Resource 注解作用对象的对比 在 Spring 框架中,@Autowired @Resource 都是常用的依赖注入注解,但它们的作用对象(即可以应用的位置)有所不同。作用对象指的是这些注解可以标注在哪些代码元素上(如字段、方法等),以实现 bean 的自动注入。下面我将基于您的引用信息,逐步对比两者的作用对象,并简要提及其他关键区别以确保回答完整。引用的关键点来自站内资料[^1][^2][^3]。 #### 1. **作用对象的对比** - **@Autowired 注解(Spring 特有)**: - 可以应用于以下对象: - **属性名(字段)**:直接标注在类的成员变量上,例如: ```java @Autowired private UserService userService; ``` - **setter 方法**:标注在 setter 方法上,例如: ```java @Autowired public void setUserService(UserService userService) { this.userService = userService; } ``` - **普通方法**:标注在任意方法上(例如工具方法),Spring 会在创建 bean 后调用该方法进行注入 [^1]。 - **构造器**:标注在构造函数上,用于构造器注入,例如: ```java @Autowired public UserController(UserService userService) { this.userService = userService; } ``` - 总结:@Autowired 的灵活性较高,支持多种对象类型,特别适合需要构造函数或自定义方法注入的场景 [^1][^2]。 - **@Resource 注解JavaEE 标准,但 Spring 支持)**: - 可以应用于以下对象: - **属性名(字段)**:标注在成员变量上,例如: ```java @Resource private UserService userService; ``` - **setter 方法**:标注在 setter 方法上,例如: ```java @Resource public void setUserService(UserService userService) { this.userService = userService; } ``` - 不支持普通方法构造器:@Resource 不支持直接标注在普通方法或构造器上,其作用对象相对局限 [^1][^2]。 - 注意:如果声明在字段上,本质上还是通过 setter 方法注入(Spring 在幕后执行),但可以省略显式的 setter 方法 [^2]。 **对比总结**: | 作用对象 | @Autowired | @Resource | |------------------|------------|-----------| | 属性字段 | ✅ | ✅ | | setter 方法 | ✅ | ✅ | | 普通方法 | ✅ | ❌ | | 构造器 | ✅ | ❌ | | 默认注入方式 | byType | byName | | 来源 | Spring | JavaEE | 从作用对象的角度看,@Autowired 更灵活,因为它支持构造器普通方法注入,而 @Resource 仅适用于字段 setter 方法 [^1][^2][^3]。 #### 2. **其他关键区别概述** - **注入方式**: - @Autowired 默认基于类型(byType)注入,如果容器中存在多个同类型 bean,需配合 @Qualifier 指定名称 [^2]。 - @Resource 默认基于名称(byName)注入,它会优先按 bean 名称匹配,如果未指定名称,则回退到 byType [^2]。 - **来源兼容性**: - @Autowired 是 Spring 框架专有注解,依赖于 Spring IOC 容器。 - @Resource 来自 JavaEE(javax.annotation.Resource),但在 Spring 中被完整支持,适用于需要跨框架兼容的场景 [^1][^3]。 - **错误处理**: - @Autowired 默认要求 bean 必须存在(required=true),可通过 required=false 忽略缺失 bean [^2]。 - @Resource 在未找到 bean 时会抛出异常,行为更严格。 在实际开发中,推荐优先使用 @Autowired,因为它与 Spring 生态集成更紧密且功能更丰富;但如果项目需要避免 Spring 依赖或强调标准 JavaEE,@Resource 是更好的选择 [^1][^3]。 #### 相关问题 1. @Autowired @Resource 在注入方式(byType vs byName)上有什么具体区别?它们如何处理多个候选 bean 的情况? 2. 在 Spring Boot 项目中,如何通过注解配置来优化 @Autowired @Resource 的使用? 3. 为什么在某些场景下推荐使用 @Autowired 而非 @Resource?能否举例说明?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值