@Autowired
和@Resource
区别与联系,到底什么时候用
@Autowired
- 来源:
@Autowired
是 Spring 框架提供的注解,主要用于自动装配 Bean。 - 默认行为:
@Autowired
默认按照类型(type)进行装配。如果类型匹配的 Bean 多于一个,则会抛出异常,除非指定了具体的 Bean 名称。 - 可选参数: 可以通过
@Qualifier
注解来指定具体的 Bean 名称。 - 使用场景: 主要在 Spring 应用中使用,特别是在需要依赖注入的情况下。
- 源码:
public @interface Autowired {
boolean required() default true;
}
@Resource
- 来源:
@Resource
是 JSR-330 规范的一部分,也被称为 Dependency Injection for Java (DI) 规范。 - 默认行为:
@Resource
默认按照名称(name)进行装配。如果没有指定名称且找不到匹配的 Bean,则会按照类型进行装配。 - 可选参数: 可以通过 name 属性指定具体的 Bean 名称。
- 使用场景: 可以在任何 Java 应用中使用,不仅限于 Spring 应用。
- 源码:
public @interface Resource {
String name() default "";
String lookup() default "";
Class<?> type() default Object.class;
AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;
boolean shareable() default true;
String mappedName() default "";
String description() default "";
public static enum AuthenticationType {
CONTAINER,
APPLICATION;
private AuthenticationType() {
}
}
}
总结
@Auowired
主要用于 Spring 应用,按类型装配,默认情况下可以通过@Qualifier
指定具体 Bean 名称。@Resource
更通用,按名称装配,如果没有指定名称则按类型装配,适用于多种 Java 应用。
实际开发场景中,类的命名需要符合规范,尽量不要有相同名称的bean出现,因此,两者的使用都不影响。所以这也要取决于具体的应用场景和个人的习惯