@Resource和@Autowired两个注解的区别及说明

 更新时间:2024年06月11日 15:47:21   作者:有WiFi就好说  
这篇文章主要介绍了@Resource和@Autowired两个注解的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

回答

首先这@Resource @Autowired这两个注解都是Spring生态里去实现Bean的依赖注入(在springmvc项目和springboot项目中都可以使用)

下面我在说一下这个注解的区别

1.@Autowired

@AutowiredSpring里面提供的一个注解,它默认是根据类型来实现Bean的依赖注入;

@Autowired里面有一个required属性,默认值是true 表示强制要求bean实例的一个注入,在应用启动的时候,如果IOC容器中不存在对应类型的bean,那么启动就会报错;如果我们不希望实现依赖注入就可以把这个属性设置为false

其次如果Spring IOC容器中存在多个相同类型的bean实例,但是由于@Autowired是根据类型去进行注入的,所以Spring启动的时候就会提示一个错误,就是原本只能注入一个单实例Bean,但是现在Ioc容器存在多个,导致注入失败;针对这个问题,可以使用@Primary @Qualifier这两个注解来解决;

@Primary表示主要的Bean,当存在多个相同类型的Bean的时候,会优先使用声明了@Primary注解的一个Bean

@Qualifier 相当于条件筛选,可以根据Bean的名字可以去找到需要装配的目标Bean

2.@Resource

接下来我再解释一下@Resource这个注解,@Resource是JDK中提供的一个注解,只不过Spring在实现上提供了这个注解的一个功能支持,它的使用方式和@Autowired类似,

最大的区别就是@Resource可以支持ByName 和 ByType两种注入方式;

  • 如果使用name属性,spring会根据bean的名字来进行依赖注入;
  • 如果使用type属性,spring会根据bean的类型来进行依赖注入,如果两个属性都没有进行设置,@Resource默认是根据定义的属性名字去容器中进行匹配,如果没有匹配成功,再根据类型来匹配;
  • 如果两个都没有匹配到就会报错

总结

1.来源不同

@Autowired 是Spring提供的一个注解,@Resource是JSR 250规范里定义的一个注解,只不过Spring对JSR 250提供了支持

2.依赖查找顺序不同

  • @Autowired 先根据类型(bytype)查找 如果存在多个Bean,再根据属性名字(byName)进行查找
  • @Resource 先根据名字(byName)查找,如果根据名称查不到 再根据类型(bytype)查找

@Autowired默认是根据类型来进行匹配的,如果容器中存在多个类型相同的实例就会报错,此时可以通过配合@Primary或@Qualifier注解来实现根据名字进行装配

  • @Resource 既可以根据名字匹配(byName),也可以根据属性匹配(byType);
  • 因为@Resourc两个属性name type,当配置了name指定时,就会根据名字匹配;
  • 使用了type指定就会根据类型匹配;
  • 如果两个属性都没有设置,默认就是根据定义的属性名字去容器中进行匹配的,如果 没有匹配成功在进行类型匹配,都没有成功就会报错。

3.支持的参数不同

@Resource支持7个参数 最常用的就是name type

@Autowired 只支持一个参数 required

4.依赖注入的支持不同

@Autowired 支持构造方法注入,属性注入,Setter方法注入

@Resource 只支持属性注入,Setter方法注入 不支持构造方法注入

5.编译器IDEA的提示不同

当注入Mapper对象时,使用@Autowired注解 编译器会报错,而是用@Resource注解则不会提示错误

注入方式实例

1.属性注入

@RestController
public class UserController {
    // 属性注入
    @Autowired
    private UserService userService;
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

2.setter方法注入

@RestController
public class UserController {
    // Setter 注入
    private UserService userService;
 
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

3.构造方法注入

@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;
 
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 开发10年,全记在这本Java进阶宝典里了

    开发10年,全记在这本Java进阶宝典里了

    这篇文章主要给大家分享介绍了这本Java进阶宝典里,是开发10年总结出来的,文中通过图文介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-04-04
  • spring boot只需两步优雅整合activiti示例解析

    spring boot只需两步优雅整合activiti示例解析

    这篇文章主要主要来教大家spring boot优雅整合activiti只需两步就可完成测操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-03-03
  • Java获取http和https协议返回的json数据

    Java获取http和https协议返回的json数据

    本篇文章主要介绍了Java获取http和https协议返回的json数据 ,本篇文章提供两个方法,帮助各位如何获取http和https返回的数据。有兴趣的可以了解一下。
    2017-01-01
  • Java基础知识总结之继承

    Java基础知识总结之继承

    这一篇我们来学习面向对象的第二个特征——继承,文中有非常详细的基础知识总结,对正在学习java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Spring Boot项目中如何对接口请求参数打印日志

    Spring Boot项目中如何对接口请求参数打印日志

    在SpringBoot项目中,打印接口请求参数有多种方法,如使用AOP、控制器建议、拦截器、@ModelAttribute、SpringBootActuator、日志框架的MDC、自定义过滤器和SpringWebflux,这些方法有助于API调试和监控,但需注意隐私和敏感信息安全
    2024-10-10
  • 浅谈Spring AOP中args()和argNames的含义

    浅谈Spring AOP中args()和argNames的含义

    这篇文章主要介绍了Spring AOP中args()和argNames的含义,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Struts2 Result 参数详解

    Struts2 Result 参数详解

    这篇文章主要讲解Struts2 Result的参数,讲的比较详细,希望能给大家做一个参考。
    2016-06-06
  • Spring Security基于JWT登录认证的项目实践

    Spring Security基于JWT登录认证的项目实践

    JWT被用来在身份提供者和服务提供者间传递被认证的用户身份信息,本文主要介绍了Spring Security基于JWT登录认证的项目实践,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Java 深入浅出掌握Map集合之双列集合

    Java 深入浅出掌握Map集合之双列集合

    双列集合是每个元素都有键与值两部分组成的集合,记录的是键值对对应关系,即通过键可以找到值,键必须是唯一,值可以重复,接下来跟着小编具体了解吧
    2021-11-11
  • Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    这篇文章主要介绍了Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06

最新评论