还在使用@Autowired 吗?

Java经验总结

共 2158字,需浏览 5分钟

 ·

2021-08-02 11:31

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


浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报