当前位置: 首页 > news >正文

@Resource和@Autowire

@Resource 和@Autowire

@ResourceJava 中用于 依赖注入(Dependency Injection, DI)的一种注解,属于 J2EE(Jakarta EE) 规范,来自 javax.annotation.Resource

它的主要作用是在 Spring 或其他依赖注入框架(如 Java EE 容器)中注入 Bean


1. @Resource 的基本用法

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Resource
    private UserRepository userRepository; // 自动注入 UserRepository

    public void saveUser(User user) {
        userRepository.save(user);
    }
}

作用

  • @Resource 自动查找 Spring 容器中的 UserRepository Bean 并注入。
  • 作用类似于 @Autowired

2. @Resource vs @Autowired

@Resource@Autowired
来源javax.annotation.Resource(J2EE 规范)org.springframework.beans.factory.annotation.Autowired(Spring)
默认方式按名称name 属性)注入按类型type)注入
可选属性name(按 Bean 名称)和 type(按 Bean 类型)仅按类型
依赖 Spring?❌(兼容 J2EE)✅(Spring 专有)

📌 主要区别

  • @Resource 默认按名称(如果 name 为空,则按类型)。
  • @Autowired 默认按类型(如果存在多个匹配 Bean,可以加 @Qualifier 指定)。
  • 如果需要 J2EE 兼容性(如 Tomcat、Jakarta EE),建议使用 @Resource

3. @Resource 注入的三种方式

方式 1:按名称注入(默认)

@Resource(name = "userRepository")
private UserRepository userRepo;

会查找 Spring 容器中的 userRepository Bean,并注入。


方式 2:按类型注入

如果不指定 name,则 默认按类型查找

@Resource
private UserRepository userRepository;

如果 UserRepository 只有一个 Bean,则成功注入

如果有多个 Bean,可能会报错

NoUniqueBeanDefinitionException: expected single matching bean but found 2

解决方法

  • 通过 name 指定
  • 或者使用 @Primary 标注主 Bean
  • 或者使用 @Qualifier(如果改用 @Autowired

方式 3:在方法上使用

@Resource
public void setUserRepository(UserRepository userRepository) {
    this.userRepository = userRepository;
}

Spring 调用该方法,并注入 UserRepository Bean


4. @Resource 使用场景

✅ 场景 1:在 Spring Boot 项目中

一般用于 Service 层或 DAO 层

@Service
public class OrderService {

    @Resource
    private OrderRepository orderRepository;

    public Order findOrder(Long id) {
        return orderRepository.findById(id).orElse(null);
    }
}

✅ 场景 2:在非 Spring 框架的 Java EE 应用

可以注入 JNDI 资源(如 DataSource)

@Resource(name = "jdbc/MyDataSource")
private DataSource dataSource;

用于 Java EE 服务器环境(Tomcat、GlassFish)


5. 什么时候用 @Resource?

场景推荐注解
需要 Spring 兼容性@Autowired
需要 J2EE 兼容性(Tomcat、GlassFish)@Resource
需要 按名称注入@Resource(name="beanName")
需要 按类型注入@Autowired(默认)

6. 结论

  • @Resource 主要用于 按名称(默认)或按类型 注入 Bean。
  • 如果希望 Java EE 兼容性(如 JNDI 注入),用 @Resource
  • 如果只使用 Spring,推荐 @Autowired(更灵活)

🚀 最佳实践

  • Spring 框架项目 首选 @Autowired
  • Java EE 兼容项目 使用 @Resource
  • 需要 按名称 注入时,@Resource(name="beanName") 更合适。

相关文章:

  • Java 中 LinkedList 的底层数据结构及相关分析
  • 【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)
  • UE4学习笔记 FPS游戏制作6 添加枪口特效
  • 详细解析GetOpenFileName()
  • Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析
  • 区块链技术驱动金融第一章 —— 走进区块链的基石:密码学与加密货币
  • 性能测试过程实时监控分析
  • 虚幻基础:动作系统3
  • 基于Arduino控制的温室蔬菜园环境监控系统(论文+源码)
  • python-56-基于Vue和Flask进行前后端分离的项目开发示例实战
  • FPGA学习(二)——基于DE2-115开发板的LED流水灯设计
  • 构建下一代AI Agent:自动化开发与行业落地全解析
  • SpringBoot3+Vue3实战(Vue3快速开发登录注册页面并对接后端接口)(4)
  • <table>内有两行<tr>,第一行设定高度为60,剩余第二行,和右侧元素高度补齐。
  • Linux 锁、线程同步
  • Elasticsearch text字段检索方法
  • 各种医学方面大模型总结——自用
  • 前端调试实战指南:从入门到高阶的完整解决方案
  • 【Triton 教程】triton_language.tensor
  • 【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析
  • 阿里上季度营收增7%:淘天营收创新高,AI产品营收连续七个季度三位数增长
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验
  • 联合国第二届运动会闭幕,刘国梁受邀成为“联合国运动会大使”
  • “80后”李灿已任重庆市南川区领导,此前获公示拟提名为副区长人选
  • 中美会谈前都发生了什么?美方为何坐不住了?
  • 家电维修担心遇“李鬼”?上海推动“物业+专业服务”进社区