@Resource和@Autowire
@Resource 和@Autowire
@Resource
是 Java 中用于 依赖注入(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")
更合适。