既然标题说了不推荐使用 @Autowired 那肯定有好的代替它的啦,那就是@Resource 。 那 @Resource 是什么呢?下面我们去对比下 @Resource 和 @Autowired 的区别吧!
区别一
@Autowired 是 Spring 自带的注解
@Resource 是 J2EE提供,Spring 支持
区别二
@Autowired 默认按类型装配
@Resource 默认按照名称进行装配
我们一起看看 @Resource 的源码。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
String name() default "";
Class<?> type() default Object.class;
Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;
boolean shareable() default true;
String description() default "";
String mappedName() default "";
String lookup() default "";
public static enum AuthenticationType {
CONTAINER,
APPLICATION;
private AuthenticationType() {
}
}
}
从上面看到 @Resource 有两个重要的属性:name 和 type 。
上面虽然说了 "默认按照名称进行装配" 但是可以按照类型处理。
Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,type 属性则解析为 bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
上面的话就是介绍了 @Resource 装配顺序:
- 1 如果同时指定了 name 和 type ,则从 Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常
- 2 如果指定了 name ,则从 Spring 上下文中查找名称(id)匹配的 bean 进行装配,找不到则抛出异常
- 3 如果指定了 type ,则从 Spring 上下文中找到类型匹配的唯一 bean 进行装配,找不到或找到多个,都抛出异常
- 4 如果既没指定 name ,也没指定 type ,则自动按照 byName 方式进行装配。如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Resource 大致讲完了,是不是感觉 @Autowired 和 @Resource 都差不多,只不过一个是根绝类型,一个是根据名称注入,什么建议使用 @Resource 呢?
这么说吧,因为 @Resource 是 java 自带的!以及在 idea 中不会有黄色提示线。而如果用 @Autowired 则 idea 会提示 "不建议使用字段注入 "。这可是喜欢干净的人的福利呀,为什么你还不用上呢?