还在使用@Autowired 吗?并不推荐使用!

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

相关文章
|
6月前
|
Java Spring
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
`@RequiredArgsConstructor(onConstructor = @__(@Autowired))` 是一个注解,通常用于在类中生成一个包含所有`final`和`@NonNull`注解的字段的构造函数,并且对这些字段进行自动注入(使用Spring框架的`@Autowired`注解)。让我们详细解释一下: 1. **`@RequiredArgsConstructor` 注解:** - **作用:** Lombok 提供的注解,用于自动生成类的构造函数。 - **生成的构造函数:** 生成一个包含所有`final`字段的构造函数,同时也包括被`@NonNull`注解
665 1
|
2月前
|
Java Spring 容器
@Autowired和@Resource
@Autowired和@Resource
|
5月前
|
Java
@RequiredArgsConstructor(onConstructor_ = @Autowired)报错
@RequiredArgsConstructor(onConstructor_ = @Autowired)报错
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?
233 0
|
6月前
|
Java Spring 容器
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
294 0
|
6月前
|
Java Spring
spring注解@Autowired、@Resource说明
spring注解@Autowired、@Resource说明
|
Java Spring
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
SpringBoot 中- HandlerInterceptor 中 @Autowired 和 @Resource 为空
113 0
|
Java Spring 容器
@Inject和@Autowired的区别
@Inject和@Autowired的区别
SpringAOP导致@Autowired依赖注入失败
SpringAOP导致@Autowired依赖注入失败
198 1
|
开发框架 Java Spring
spring注解:@Autowired 和@Resource
spring注解:@Autowired 和@Resource
308 0