首页 > 其他分享 >全面正确理解 @Autowired 和 @Resource

全面正确理解 @Autowired 和 @Resource

时间:2023-09-27 11:36:09浏览次数:43  
标签:Resource Autowired add userService public 正确理解 注入

@Autowired和@Resource都是Spring/Spring Boot项目中,用来进行依赖注入的注解。他们的区别主要是下面几点:

  1.来源不同;
  2.依赖查找的顺序不同;
  3.支特的参数不同;
  4.依赖注入的用法不同:

一、来源不同。

  @Autowire 是来自 spring 的注解,@Resource 是来自 Java 的注解。(JSR-250)

  小知识:JSR是Java Specification Requests的缩写,意思是“Java规范提案”。任何人都可以提交JSR给Java官方,但只有最终确定的JSR,才会以JSR-XXX的格式发布,如JSR-250,而被发布的

JSR就可以看作是Java语言的规范或标准。

二、依赖查找的顺序不同 

  @Autowire 是先按照 byType 去查找,再按照 byName去查找。

  查看 org.springframework.bean.factory.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 分析得出,执行流程如下: 

  @Resource 是先按照 byName 去查找,再按照 byType 去查找。

  查看 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 分析得出,执行流程如下:

 三、支持的参数不同。

  @Autowired 和 @Resource 在使用时都可以设置参数,比如给@Resource注解设置name和type参数,实现代码如下:

@Resource(name = "userinfo",type = UserInfo.class)
private UserInfo user;

  @Autowired 只支持一个参数:

  @Resource 支持七个参数:

四、依赖注入的用法不同。

  @Autowired 支持属性注入、构造方法注入和Setter注入。@Resource 只支持属性注入和 Setter 注入。

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


/* 构造方法注入 */
@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);
    }
}
/* 构造方法注入 */ @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); } }

 

标签:Resource,Autowired,add,userService,public,正确理解,注入
From: https://www.cnblogs.com/chuhecc/p/17732274.html

相关文章

  • 为什么@Resource无法注入泛型类型而@Autowired可以
    在Spring框架中,我们通常使用@Autowired和@Resource两个注解来实现属性注入。但是当涉及到泛型类型时,使用@Resource注解就会失败,而@Autowired可以正常工作。这篇文章就来分析它们之间的区别。@Autowired可以直接注入泛型类型,例如:```java@AutowiredprivateRepository<User>......
  • [Spring]浅谈Spring的Resources体系
    Spring为什么要创建Resources体系Java的标准java.net.url类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问.举个例子:没有标准化的URL实现类用于获取根据ServletContext的类路径。并且缺少某些Spring所需要的功能,例如检测某资源是否存在等。ResourceSpring的Resour......
  • class path resource [.xml] cannot be opened because it does not exist
    classpathresource[bean1.xml]cannotbeopenedbecauseitdoesnotexist错误重现bug:Exceptioninthread"main"org.springframework.beans.factory.BeanDefinitionStoreException:IOExceptionparsingXMLdocumentfromclasspathresource[bean1.xml]......
  • 解决pycharm报错:_jb_pytest_runner.py:7:....from pkg_resources import iter_entry_p
    遇到问题执行pytest用例出现警告D:\pycharm\PyCharm2020.1.5\plugins\python\helpers\pycharm_jb_pytest_runner.py:7:DeprecationWarning:pkg_resourcesisdeprecatedasanAPI.Seehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimport......
  • Resource文件夹(转)
    转自:#Assets-Unity为何不建议使用ResourcesFolder?-简书(jianshu.com)最近换项目,中间有了几天“间歇期”,正好可以抽空读一读这篇文章,读起来并不轻松,英语水平有限,尝试理解其中的含义概念,有些段落反反复复看了多次,在这里把笔记分享出来,这也是对知识的一次总结。初学Unity......
  • 关于使用LoadResource、EndUpdateResource的问题
    需要操作资源DLL中的资源,自作聪明的将其写成一个如下的类://---------------------------------------------------------------------------#ifndefUnit2H#defineUnit2H#include<windows.h>#include<assert.h>//-------------------------------------------------------......
  • 关于getClass().getClassLoader().getResourceAsStream——转载自https://www.cnblogs
    关于getClass().getClassLoader().getResourceAsStreamInputStreamis=getClass().getClassLoader().getResourceAsStream("helloworld.properties");getClass():取得当前对象所属的Class对象getClassLoader():取得该Class对象的类装载器类装载器负责从Java字符文件将字符流读......
  • @resource与@autowired的区别
    @Autowired是根据类型进行注入,容器中只能有一个该类型的实例;@Resource是根据名称进行注入,容器中一种类型可以存在多个实例; @Bean("defaultKafka")publicKafkaTemplate<Integer,String>defaultKafkaTemplate(){KafkaTemplate<Integer,String>template......
  • SpringBoot打成jar运行后无法读取resources里的文件
    开发一个word替换功能时,因替换其中的内容功能需要word模版,就把word_replace_tpl.docx模版文件放到resources下在开发环境中通过下面方法能读取word_replace_tpl.docx文件,但是打成jar包在linux下运行后无法找到文件了Filefile=ResourceUtils.getFile(ResourceUtils.CL......
  • @Autowired和@Resource的区别
    @Autowired和@Resource都是Spring框架中用于依赖注入的注解,它们的作用是将一个依赖对象自动注入到另一个对象中。它们的区别如下:@Autowired是Spring自带的注解,而@Resource是JavaEE5规范中定义的注解,需要依赖JDK或者其他框架的支持。@Autowired默认按照类型进行自动装配,如果有......