@Resource和@Autowire
@Resource
和@Autowired
都是Java中用于依赖注入(Dependency Injection,DI)的注解,它们在Spring框架中被广泛使用,但有一些区别,以下是详细介绍:
定义和来源
-
@Resource:是Java标准注解(JSR-250),由Java社区提出,属于Java规范的一部分,不依赖于Spring框架。它主要通过注解的方式实现依赖注入,可以标注在字段或setter方法上。
-
@Autowired:是Spring框架特有的注解,是Spring对依赖注入功能的实现方式之一,只能在Spring项目中使用。
作用
-
@Resource:默认按名称(byName)进行注入,如果找不到与名称匹配的Bean,再按类型(byType)进行注入。如果两者都找不到匹配的Bean,会抛出异常。它既可以标注在字段上,也可以标注在setter方法上。
-
@Autowired:默认按类型(byType)进行注入。如果存在多个相同类型的Bean,就根据in名称。也可以通过
@Qualifier
注解指定具体的Bean。它只能标注在字段、构造方法或setter方法上。
使用方式
-
@Resource:
-
字段注入
@Resource private UserService userService;
-
setter方法注入
private UserService userService;@Resource public void setUserService(UserService userService) {this.userService = userService; }
-
-
@Autowired:
-
字段注入
@Autowired private UserService userService;
-
构造方法注入
@Autowired public SomeClass(UserService userService) {this.userService = userService; }
-
setter方法注入
private UserService userService;@Autowired public void setUserService(UserService userService) {this.userService = userService; }
-
适用场景
-
@Resource:由于是Java标准注解,不依赖于Spring框架,因此在一些非Spring项目中,如果需要实现依赖注入功能,可以使用
@Resource
。另外,如果项目中同时使用了其他Java规范相关的技术,使用@Resource
可以保持代码的一致性。 -
@Autowired:在Spring项目中,
@Autowired
是更常用的方式。它提供了更灵活的注入方式,如通过@Qualifier
指定具体的Bean等。同时,Spring对@Autowired
的优化和扩展也更多,例如支持构造方法注入等。
总结
-
相同点:
@Resource
和@Autowired
都可以实现依赖注入功能,都可以标注在字段或方法上。 -
不同点:
@Resource
是Java标准注解,按名称或类型注入;@Autowired
是Spring框架的注解,按类型注入,更灵活,支持构造方法注入等。