深入理解@Resource与@Autowired:用法与区别解析
@Resource:
@Resource
是Java EE提供的注解,也可以在Spring中使用。它是按照名称进行注入的,默认通过属性名(通常是类名的小驼峰命名方式)或者name
属性来匹配。如果找不到符合名称的bean,则会抛出异常。在使用时可以指定 name
属性来明确指定要注入的bean的名称,也可以通过 type
属性来指定要注入的bean的类型。 示例:
假设有一个叫做 SomeBean
的类:
@Component
public class SomeBean {
? ?// ...
}
使用 @Resource
注解来注入该类的实例时,可以直接在需要注入的属性上使用 @Resource
注解,属性名会被默认匹配到对应的bean:
@Component
public class AnotherBean {
? ?@Resource
? ?private SomeBean someBean;
? ?// ...
}
但需要注意以下问题:
-
命名不一致:如果属性名与bean的名称不一致,将无法正确匹配到对应的bean,会抛出异常。此时可以通过指定
name
属性来明确指定要注入的bean的名称。@Component public class AnotherBean { ? ?@Resource(name = "otherName") ? ?private SomeBean someBean; ? ?// ... }
我们使用
@Resource
注解的name
属性指定了要注入的 bean 的名称为 "otherName"。因此,Spring 会在容器中查找名称为 "otherName" 的 bean,并将其注入到AnotherBean
类的someBean
属性中 -
多个匹配项:如果存在多个符合类型的bean,且都符合属性名匹配规则,会抛出异常。此时可以通过指定
name
属性来明确指定要注入的bean的名称,或者结合@Qualifier
注解使用。举个例子,假设有两个名为
someBean1
和someBean2
的 bean:@Component("someBean1") public class SomeBean { ? ?// ... } ? @Component("someBean2") public class AnotherBean { ? ?// ... } ? @Component public class YetAnotherBean { ? ?@Autowired ? ?@Qualifier("someBean1") ? ?private SomeBean someBean; ? ?// ... }
@Qualifier
注解中的值应该是要注入的 bean 的名称或标识符,而不是属性名或类名。
@Autowired:
@Autowired是Spring框架提供的注解,在Spring中广泛应用。它默认按照类型进行注入,通过匹配对象类型来实现自动装配。如果存在多个匹配的bean,可以使用 @Qualifier
注解结合 @Autowired
来指定具体的bean名称进行注入。 示例:
@Autowired
private SomeBean someBean;
-
@Autowired
是非必须的,如果找不到匹配的Bean,Spring容器仍然会正常启动。 -
@Resource
是必须的,如果找不到匹配的Bean,会抛出异常。
?总结:对于使用 Spring Boot 项目,通常建议优先使用 @Autowired
注解。因为 Spring Boot 默认集成了 Spring 框架,并做了一些自动配置,@Autowired
可以更好地适应和利用 Spring Boot 的特性。此外,@Autowired
的语义也更加清晰和直观。因为它是 Spring 提供的原生注解,而且更加灵活。
如果你的项目同时使用了 JavaEE 相关技术,可能更倾向于使用 @Resource
。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!