当前位置:网站首页 > R语言数据分析 > 正文

autowired不生效(autowired报错)



为什么 Spring 和 IDEA 都推荐使用 @Resource注解而不是@Autowired?

  • 1.0 @Autowired 和 @Resource简单介绍
  • 1.1 @Autowired 和 @Resourceu区别
  • 1.来源不同
  • 2.依赖查找顺序不同
  • 2.1 @Autowired 查找顺序
  • 2.2 @Resource 查找顺序
  • 2.3 查找顺序小结
  • 3.支持的参数不同
  • 4.依赖注入的支持不同
  • a) 属性注入
  • b) 构造方法注入
  • c) Setter 注入
  • 5.编译器提示不同

大家在使用IDEA开发的时候有没有注意到过一个提示,在字段上使用Spring的依赖注入注解@Autowired后会出现警告,但是使用@Resource却不会出现,今天我们来聊聊这两者的区别。

和 都是 Spring/Spring Boot 项目中,用来进行。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同。

springboot 通过addResourceHandler 不起作用_Java

@Autowired 和 @Resource 的区别主要体现在以下 5 点:

  • 来源不同;
  • 依赖查找的顺序不同;
  • 支持的参数不同;
  • 依赖注入的支持不同;
  • 编译器 IDEA 的提示不同。

1.来源不同

和 来自不同的“父类”,其中 是 Spring 定义的注解,而 是 定义的注解,它来自于 JSR-250(Java 250 规范提案)。

2.依赖查找顺序不同

依赖注入的功能,是通过先在 容器中查找对象,再将对象注入引入到当前类中。而查找有分为两种实现:按名称(byName)查找或按类型(byType)查找,其中 都是既使用了名称查找又使用了类型查找,但二者进行查找的顺序却截然相反。

2.1 @Autowired 查找顺序

springboot 通过addResourceHandler 不起作用_依赖注入_02

springboot 通过addResourceHandler 不起作用_intellij-idea_03

2.2 @Resource 查找顺序

springboot 通过addResourceHandler 不起作用_spring_04

springboot 通过addResourceHandler 不起作用_java_05

2.3 查找顺序小结

由上面的分析可以得出:

@Autowired 先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找;


@Resource 先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找。

3.支持的参数不同

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

而 @Resource 支持 7 个参数,支持的参数如下图所示:

springboot 通过addResourceHandler 不起作用_java_06

springboot 通过addResourceHandler 不起作用_依赖注入_07

4.依赖注入的支持不同

支持依赖注入的用法不同,常见依赖注入有以下 3 种实现:

属性注入
构造方法注入
Setter 注入




这 3 种实现注入的实现代码如下。

a) 属性注入
b) 构造方法注入
c) Setter 注入

其中,@Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入,当使用 @Resource 实现构造方法注入时就会提示以下错误:

springboot 通过addResourceHandler 不起作用_java_08

5.编译器提示不同

当使用 IDEA 专业版在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息,报错内容如下图所示:

springboot 通过addResourceHandler 不起作用_依赖注入_09

springboot 通过addResourceHandler 不起作用_spring_10

总结

@Autowired 和 @Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同:

来源不同:;

@Autowired功能虽说非常强大,但是也有些不足之处。比如它跟Spring强耦合了,如果换成了其他框架,功能就会失效。而@Resource是JSR-250提供的,它是Java标准,绝大部分框架都支持。

依赖查找的顺序不同:;

Autowired默认按byType自动装配,而@Resource默认byName自动装配。

支持的参数不同:

@Autowired只包含一个参数:required,表示是否开启自动准入,默认是true。而@Resource包含七个参数,其中最重要的两个参数是:name 和 type。

依赖注入的用法支持不同

@Autowired能够用在:构造器、方法、参数、成员变量和注解上,而@Resource能用在:类、成员变量和方法上。

编译器 IDEA 的提示不同:。

@Autowired如果要使用byName,需要使用@Qualifier一起配合。而@Resource如果指定了name,则用byName自动装配,如果指定了type,则用byType自动装配。

到此这篇autowired不生效(autowired报错)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • termux启动kali(termux启动命令)2026-03-06 23:00:07
  • treesize free怎么切换中文(treesizefree怎么用)2026-03-06 23:00:07
  • fedora换国内源(centos更换国内源)2026-03-06 23:00:07
  • MSVCP140.dll没有被指定在windows上运行(msvcr120.dll没有被指定在windows上运行)2026-03-06 23:00:07
  • ar模块是什么(AR模块是什么意思)2026-03-06 23:00:07
  • Ffprobe打包exe(filza打包deb文件)2026-03-06 23:00:07
  • cruise2020安装教程(cruise2019安装教程)2026-03-06 23:00:07
  • pillow和bolster 区别(pillow和autosleep哪个好)2026-03-06 23:00:07
  • linux目录重命名命令rename(linux文件重命名rename)2026-03-06 23:00:07
  • ldap未授权访问漏洞修复(apache druid未授权访问)2026-03-06 23:00:07
  • 全屏图片