@Resource和@Autowired注解区别是什么

发布时间:2023-04-18 17:29:38 作者:iii
来源:亿速云 阅读:109

这篇文章主要介绍“@Resource和@Autowired注解区别是什么”,在日常操作中,相信很多人在@Resource和@Autowired注解区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”@Resource和@Autowired注解区别是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

引言

@Resource和@Autowired都是Spring Framework中用于依赖注入的注解,但它们有几点不同:

来源不同:@Resource注解来自于J2EE规范中;而@Autowired注解是Spring框架提供的。

搜索策略不同:@Resource注解默认按照名称进行匹配查找,如果找不到,则按照类型进行匹配。而@Autowired注解默认是按照类型进行匹配,如果出现多个类型一致的实例对象,则需要指定名称。

属性不同:@Resource注解没有属性名称,只有一个name属性,表示要注入的Bean名称。而@Autowired注解有两个重要属性:required和name,其中required属性表示是否必须注入该属性,默认为true;name属性表示要注入的Bean名称。

1、用法层面分析

首先,我们创建一个接口UserService和两个实现类UserServiceImpl1UserServiceImpl2

public interface UserService {
    void save();
}
@Service
public class UserServiceImpl1 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl1 save");
    }
}
@Service
public class UserServiceImpl2 implements UserService {
    @Override
    public void save() {
        System.out.println("UserServiceImpl2 save");
    }
}

然后,我们可以在需要使用UserService的地方进行依赖注入。

使用@Resource注解:

@Component
public class UserController {
    @Resource
    private UserService userService;
    // ...
}

使用@Autowired注解:

@Component
public class UserController {
    @Autowired(required = false)
    @Qualifier("userServiceImpl1")
    private UserService userService;
    // ...
}

上面的代码中,@Resource注解直接将UserService对象注入到userService属性中,而@Autowired注解需要结合@Qualifier注解来指定具体的Bean名称,并且通过required属性设置是否必须注入该属性。注意,@Autowired注解也可以省略@Qualifier注解,此时会按照类型进行匹配查找对应的Bean。

2、概念层面分析

再来分析一下其中的道道~~

Spring Framework中的依赖注入实现原理是基于Java反射机制和JavaBean规范的。

Spring框架通过反射机制实例化需要注入的Bean对象,并将其存储到一个Map中,其中Key为Bean名称,Value为Bean实例对象。

接下来,Spring会根据JavaBean规范(即属性名以及该属性的setter方法)查找需要注入的属性,并通过反射机制调用对应的setter方法进行属性注入。

在依赖注入的过程中,Spring框架通常采用两种搜索策略:

Spring框架提供了多种注解用于依赖注入,包括:

Spring Framework的依赖注入实现原理是基于Java反射机制和JavaBean规范的,并通过多种注解实现不同的依赖注入方式。

@Resource和@Autowired都是Spring的依赖注入注解,但它们有如下区别:

下面分别介绍@Resource和@Autowired注解的优缺点:

@Resource优点:

@Resource缺点:

@Autowired优点:

@Autowired缺点:

对于依赖注入的原理,可以简单地概括为以下三个步骤:

@Resouce和@Autowired都是Spring提供的依赖注入注解,各有优缺点。在实际开发中,可以根据具体的应用场景选择合适的注解进行使用。

3、源码层面分析

在Spring Framework源码层面,@Resource和@Autowired注解的实现类分别为javax.annotation.Resource和org.springframework.beans.factory.annotation.Autowired。下面我们来看一下它们的具体实现。

@Resource注解的实现原理:

代码示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
    String name() default "";
    Class<?> type() default java.lang.Object.class;
    boolean shareable() default true;
}

@Autowired注解的实现原理:

代码示例:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
    String value() default "";
}

无论是@Resource注解还是@Autowired注解,在Spring Framework源码实现上都是通过反射机制和BeanPostProcessor接口完成依赖注入的。在实际开发中,我们可以研究对应的源码实现,深入了解它们的原理,从而更好地使用这些依赖注入注解。

到此,关于“@Resource和@Autowired注解区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. @Autowired、@Resource和@Service的区别
  2. Spring中@Resource与@Autowired有什么区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

@resource @autowired

上一篇:archlinux罗技K380 F1-F12功能键锁定怎么实现

下一篇:Kotlin Flow数据流的使用场景有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》