@Autowired写在成员变量上和set方法上的区别?

探讨了Spring框架中@Autowired注解用于成员变量与setter方法的区别及应用案例。解释了不同使用场景下@Autowired的行为差异。

@Autowired写在成员变量上和set方法上的区别?

今天项目上遇到一个问题,service是普通的类,非接口实现类,如下
@Service
@Transactional
@OALogger
public class ArchiveSortManager {
..........
}
_______________________________
这样居然会报错
private ArchiveSortManager sortManager;

@Autowired
public void setSortManager(ArchiveSortManager sortManager) {
this.sortManager = sortManager;
}

而如下这样注入却正常
@Autowired
private ArchiveSortManager sortManager;

求解
关注者
6
被浏览
3634
3 个回答

菜鸡,如有错误,希望能指正

参照:

spring @Autowire property vs setter

写在成员变量上就是spring通过读取xml配置返回一个bean

只写在set方法上就是spring通过读取xml配置返回一个bean,然后将其注入你的成员变量

我是菜鸟啊,如果用set方法了,就不用@Autowired了,这两者是实现同样的功能,只不过@Autowired是交给spring容器来注入了,如果是service推荐使用@Autowired的方式,由spring来管理,如果是普通对象就用 set get方法。因为如果用struts2话,它会搜集action中所有set方法的对象,转换为json对象(如果用到的话),但是像service这种经过spring管理的是复杂对象,就会报错。你用了@Service去注解它,他就不再是简单对象了。它貌似继承或实现了其他类或借口(我也忘了)。你的第一种方式我还没见过。再说一遍,本人菜鸟

写在方法上,可以通过java代码对数据进行控制(就好像你普通的代码一样)

写在属性上,相当于写个=号赋值,他们并没有性能或其他区别,作用是一样的,只看你的习惯。

我一般会写在属性上,因为更简洁,但如果要对其进行一些操作,可以写在方法上也没问题


<think>首先,用户查询是关于Spring框架中的@Autowired@Resource注解的作用对象对比。用户明确引用了三个站内引用,我需要基于这些引用系统指令来回答。 关键点来自引用: - 引用[1]:两个注解都可以用来注入bean。@Resource是JavaEE的注解,@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特有,@Resource是JavaEE标准 [^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?能否举例说明?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值