还在使用@Autowired 吗?并不推荐使用!|8月更文挑战

724 阅读2分钟

既然标题说了不推荐使用 @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 会提示 "不建议使用字段注入 "。这可是喜欢干净的人的福利呀,为什么你还不用上呢?

一枚猫奴程序员,喜欢的请关注公众号《程序员小朱》