0


为什么Spring和IDEA不推荐使用@Autowired注解?更优雅的自动注入如何实现?

一、为什么要使用字段注入

在做Spring项目的开发时,我们通常为了降低项目的耦合性会使用Autowired注解来让Spring自动注入。

但Spring是不建议这么用的:

Field injection is not recommended
Inspection info: Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”.

翻译一下:
字段注入不被推荐
检查信息:Spring团队建议:“在您的bean中始终使用基于构造函数的依赖项注入。始终对必需的依赖项使用断言”。

同时IDEA也会报警告提示:
在这里插入图片描述

二、为什么不建议使用字段注入

Spring不建议使用字段注入,主要有以下几个原因:

  1. 可读性和维护性差:使用字段注入会使得代码中的依赖关系不够清晰,不易于阅读和维护。相比之下,构造函数注入或者Setter方法注入可以更清晰地展示类的依赖关系。
  2. 难以进行单元测试:字段注入会使得单元测试变得困难,因为在测试中很难替换掉被注入的依赖。而使用构造函数注入可以更容易地在测试中传入模拟对象。
  3. 不利于依赖解析:字段注入会使得依赖关系在类加载时就被注入,这可能导致循环依赖等问题。而构造函数注入则可以明确地指定依赖的顺序,避免这类问题。
  4. 不符合最佳实践:Spring团队认为构造函数注入是更好的实践方式,因为它可以确保类的实例化过程中依赖得到满足,并且可以更好地控制依赖的注入顺序,此外如果你以后想更换其他IOC框架,这种方式会造成与Spring生态的强耦合。

三、更好的解决办法

我们可以使用lombok提供的

RequiredArgsConstructor

注解来解决,既不用写构造方法也不用写Autowired:

@RequestMapping("/weFolder")@RestController@RequiredArgsConstructorpublicclassWeFolderController{/**
     * 此处必须通过final修饰
     */privatefinalWeFolderService weFolderService;@GetMappingpublicAjaxResultrequestFolder(@RequestParam("resourceId")Integer resourceId){FolderTree folderTree = weFolderService.requestFolder(resourceId);//folderId相当于parent_idreturnAjaxResult.success(folderTree);}}
RequiredArgsConstructor

注解主要用于将所有字段添加构造函数实现,在使用之前需要添加lombok依赖。

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

版权所有:XuanRan
未经书面授权,禁止转载。


本文转载自: https://blog.csdn.net/qq_37945670/article/details/138114479
版权归原作者 XuanRanDev 所有, 如有侵权,请联系我们删除。

“为什么Spring和IDEA不推荐使用@Autowired注解?更优雅的自动注入如何实现?”的评论:

还没有评论