与@Autowired相媲美的@Resource注解用法整理

在写依赖注入时,除了@Autowired,还经常看到@Resource的身影。@Resource与@Autowired有哪些区别和联系呢?

@Resource 是Java EE 提供的用于进行依赖注入的注解,它可以标注在字段、构造方法、Setter 方法或者配置类的方法上,完成依赖注入的操作。

与 @Autowired 注解不同的是,@Resource 是按照名称进行装配的,可以通过 name 属性指定要注入的 Bean 的名称。

一、@Resource源码

package javax.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Resource 注解标记了应用程序所需的资源。
 */
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Resource {

    /**
     * 资源的 JNDI 名称。对于字段注解,默认为字段名称。对于方法注解,默认为 JavaBeans 属性名称。
     */
    String name() default "";

    /**
     * 资源的 Java 类型。对于字段注解,这是字段的类型。对于方法注解,它是方法解析到的参数或返回类型的类型。默认为带注解的字段或参数的类型。
     */
    Class<?> type() default java.lang.Object.class;

    /**
     * 用于此资源的身份验证类型。默认为 container。
     */
    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;

    /**
     * 指示资源是否可以在此组件和其他组件之间共享。
     */
    boolean shareable() default true;

    /**
     * 该资源应映射到的产品特定名称。
     */
    String mappedName() default "";

    /**
     * 引用指向的资源的名称。它可以链接到同一环境中的另一个资源,也可以链接到不同环境中的资源,具体取决于容器定义的语法。
     */
    String lookup() default "";
}

当使用 @Resource 注解时,如果指定了 name 属性,则容器会按照指定的名称在容器中查找对应的 Bean 进行注入;如果没有指定 name 属性,则容器会按照标注 @Resource 注解的字段或方法的名称来在容器中查找对应的 Bean 进行注入。

二、@Resource应用示例

四、最后总结
@Resource与@Autowired的联系

@Resource与@Autowired的区别:

总的来说,@Autowired 是Spring框架提供的依赖注入注解,更加灵活,但与Spring框架耦合度较高;而@Resource 是Java EE提供的依赖注入注解,更加通用,但功能相对较少。

  1. 在字段上应用 @Resource 注解:

    
    public class Example {
        @Resource
        private DataSource dataSource;
    
        // 其他代码
    }
  2. 在方法上应用 @Resource 注解:

    
    public class Example {
        private DataSource dataSource;
    
        @Resource
        public void setDataSource(DataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        // 其他代码
    }
  3. 指定资源的名称:

    
    @Resource(name = "myDataSource")
    private DataSource dataSource;
    
  4. 指定资源的类型:

    
    @Resource(type = MyService.class)
    private MyService myService;
    
  5. 指定资源的身份验证类型:

    
    @Resource(authenticationType = AuthenticationType.APPLICATION)
    private MyService myService;
    
  6. 指定资源是否可共享:

    
    @Resource(shareable = false)
    private MyResource myResource;
  7. 指定资源的 JNDI 名称:

    
    @Resource(mappedName = "java:comp/env/jdbc/myDataSource")
    private DataSource dataSource;
    
  8. 指定资源的查找名称:

    
    @Resource(lookup = "java:comp/env/jdbc/myDataSource")
    private DataSource dataSource;

    这些示例展示了 @Resource 注解在不同情境下的使用方法,可以根据具体需求来选择合适的用法。

    三、使用@Resource注解注意事项
  9. 指定名称:如果使用@Resource注解进行依赖注入,可以通过name属性指定要注入的Bean的名称。如果不指定name属性,容器会按照标注@Resource注解的字段或方法的名称来在容器中查找对应的Bean进行注入。

  10. 避免名称歧义:如果容器中存在多个同类型的Bean,且没有通过name属性指定具体的Bean名称,容器会根据字段或方法的名称来进行注入。因此,在使用@Resource注解时,需要确保Bean名称的唯一性,避免名称歧义。

  11. 与@Autowired的区别:虽然@Resource和@Autowired都可以用于依赖注入,但它们的行为和用法有所不同。需要根据具体的使用场景和需求选择合适的注解。

  12. 都可以用来完成依赖注入,将一个Bean注入到另一个Bean中。

  13. 都可以标注在字段、构造方法、Setter方法或者配置类的方法上,完成依赖注入的操作。

  14. @Autowired 是Spring框架提供的注解,而 @Resource 是Java EE提供的注解。

  15. @Autowired 是按照类型进行自动装配的,如果容器中存在多个类型匹配的Bean,可以结合@Qualifier注解使用,也可以结合@Primary注解使用。而 @Resource 是按照名称进行装配的,可以通过name属性指定要注入的Bean的名称。

  16. @Autowired 是Spring特有的注解,如果要使用它,必须导入Spring的包。而 @Resource 是Java EE的标准注解,不需要额外导入包。

  17. 在使用@Autowired时,如果找不到匹配的Bean,会抛出异常;而在使用@Resource时,如果找不到匹配的Bean,会返回null。

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

missterzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值