使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

这篇具有很好参考价值的文章主要介绍了使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

# 问题原因

关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。

1.初始化问题

先看一下Java初始化类的顺序:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器。

而Autowired注入,则要排队到子类构造器以后了,SpringIOC并不会对依赖的bean是否为null做判断,JVM编译时同样也不会有问题,但如果使用不当,运行起来时或许会因为出现空指针异常。

2.对IOC容易依赖过强

@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他IOC框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。

3.其他方面

我看到网络上有一些其他方面的总结,比如:依赖过多却不够明显,违反了单一职责原则;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。

对于@Autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。追求完完全全的松耦合其实也过于理想化,应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。

# 其他使用方式

除了使用@Autowired以外,我们其实也有几种好用的方式。使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。

set方法

@RestControllerpublic class TestController2 {    ITestService testService;    /*     * 基于set注入     * */    @Autowired    public void setTestService(ITestService iTestService) {        this.testService = iTestService;    }    @GetMapping("/status2")    public Result<?> status() {        return testService.status();    }}

这种方法也使用了@Autowired注解,但是它是作用于成员变量的Setter函数上,而不是像Fied注入一样作用于成员变量上。

构造器

@RestControllerpublic class TestController1 {    ITestService testService;    /*    * 基于构造方法的注入    * */    public TestController1(ITestService iTestService) {        this.testService = iTestService;    }    @GetMapping("/status1")    public Result<?> status() {        return testService.status();    }}

它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。

构造器的简化版(推荐)

首先,需要引入lombok依赖。

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.2</version></dependency>

随后,我们在创建时就可以使用@RequiredArgsConstructor注解,它将帮我们创建构造器,final关键字必不可少。

@RestController@RequiredArgsConstructorpublic class TestController3 {    /*     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层     * */    private final ITestService testService;    @GetMapping("/status3")    public Result<?> status() {        return testService.status();    }}

我们在使用这些创建方法时,都可以调出IDEA的结构(Structure)面板进行查看,如下图所示。

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?,intellij-idea,python,java

可以看到,在这个类中,已经存在我们所需要注入的内容。

在网上有博主总结了一张表,但因为到处能看到,不知原来出处是哪里。

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?,intellij-idea,python,java

# 总结

在使用中,使用构造方法是比较可行的,加上lombok,其实也可以到达非常简便。文章来源地址https://www.toymoban.com/news/detail-547800.html

到了这里,关于使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么评论会被折叠?

    评论是读者与作者、读者与读者间进行互动的重要形式,其表现形式为:问题的探讨、观点的交流、意见的输出、对作者的支持和鼓励方面的言语表达等。其不仅作为互动的媒介,同样也是社区氛围的一种体现,良好的评论氛围有助于建设和维护健康、积极的社区生态。 但随

    2024年02月11日
    浏览(44)
  • ai写作论文会被抄袭吗为什么

    大家好,小发猫降重今天来聊聊ai写作论文会被抄袭吗为什么,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧,可以借助此类工具: 标题:AI写作论文会被抄袭吗?背后原因深度解析 近年来,随着人工智能技术的飞速发展,AI写作论

    2024年03月10日
    浏览(64)
  • 【Unity细节】Unity制作汽车时,为什么汽车会被弹飞?为什么汽车会一直抖动?

    👨‍💻个人主页 :@元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏 :unity细节和bug 😶‍🌫️优质专栏 ⭐【软件设计师高频考点暴击】 问题2:为啥会被弹飞 1.质量太小被车轮顶飞 MeshColider中勾选了Canvas 网格和网格之间碰

    2024年02月11日
    浏览(42)
  • 为什么LC谐振频率附近信号会被放大

    这个是LC低通滤波电路, 它的增益曲线是这样的 很多同学不理解为什么谐振频率附近信号会被放大, 今天就来聊一聊为什么谐振频率附近信号会被放大。 看到这个LC低通滤波电路,假设输入信号源内阻为Rs,L和C为理想电感和电容,输出信号为电容两端的电压。 整个电路阻抗

    2024年02月01日
    浏览(45)
  • Vue 和 JQuery 的区别在哪?为什么 JQuery 会被 Vue 取代?

    在 Web 前端开发领域,我们经常会遇到一些不同的工具和框架,其中 Vue 和 JQuery, JQuery 是曾经备受欢迎的选择,而现在 Vue 是大多数人的选择。本文将探讨 Vue 和 JQuery 之间的区别,并讨论为什么越来越多的开发人员放弃 JQuery 而选择 Vue。 1. 声明式 vs. 命令式 Vue 是一种声明式框

    2024年02月11日
    浏览(55)
  • 为什么说百度下个月推出文心一言会被ChatGPT完全碾压

    作者,姚远: Oracle ACE(Oracle和MySQL数据库方向) 华为云MVP 《MySQL 8.0运维与优化》的作者 中国唯一一位Oracle高可用大师 拥有包括 Oracle 10g和12c OCM在内的20+数据库相关认证。 曾任IBM公司数据库部门经理 现在一家第三方公司任首席数据库专家,服务2万+客户。 受ChatGPT成功的鼓

    2023年04月08日
    浏览(73)
  • 神秘的IP地址8.8.8.8地址到底是什么?为什么会被用作DNS服务器地址呢?

    当我们在配置网络连接或者路由器时,经常会遇到需要填写DNS服务器地址的情况。而在这些情况下,很多人都会听到一个神秘的数字地址:8.8.8.8。那么,这个地址到底是什么,为什么会被用作DNS服务器地址呢?本文将详细解释这个问题。 首先,我们需要了解一下什么是DNS。

    2024年02月03日
    浏览(60)
  • 为什么idea建议使用“+”拼接字符串

    各位小伙伴在字符串拼接时应该都见过下面这种提示: 内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法可以用单个java.lang.String串联来替换。使用字符串串联可以使代码更短、更简单。只有当得到的串联至少与原始代码一样高效或更高效时,此检查才会

    2024年02月06日
    浏览(67)
  • 为什么 IDEA 建议去掉 StringBuilder,而要使用 “+” 拼接字符串?

    作者:京东零售 姜波 来源:京东云开发者社区 各位小伙伴在字符串拼接时应该都见过下面这种提示: 内容翻译:报告StringBuffer、StringBuilder或StringJoiner的任何用法,这些用法可以用单个java.lang.String串联来替换。使用字符串串联可以使代码更短、更简单。只有当得到的串联至

    2024年02月05日
    浏览(67)
  • <dependency> idea中为什么这个变黄色

      在IDE中,当你的代码出现黄色高亮时,通常表示存在警告或建议的提示。对于Maven的 dependency 标签来说,黄色高亮可能有以下几种原因: 依赖项未找到:黄色高亮可能表示IDE无法找到指定的依赖项。这可能是由于配置错误、网络问题或仓库中缺少该依赖项等原因导致的。你

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包