一、为什么要使用字段注入
在做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不建议使用字段注入,主要有以下几个原因:
- 可读性和维护性差:使用字段注入会使得代码中的依赖关系不够清晰,不易于阅读和维护。相比之下,构造函数注入或者Setter方法注入可以更清晰地展示类的依赖关系。
- 难以进行单元测试:字段注入会使得单元测试变得困难,因为在测试中很难替换掉被注入的依赖。而使用构造函数注入可以更容易地在测试中传入模拟对象。
- 不利于依赖解析:字段注入会使得依赖关系在类加载时就被注入,这可能导致循环依赖等问题。而构造函数注入则可以明确地指定依赖的顺序,避免这类问题。
- 不符合最佳实践: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
未经书面授权,禁止转载。
版权归原作者 XuanRanDev 所有, 如有侵权,请联系我们删除。