为什么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
@RequiredArgsConstructor
public class WeFolderController {

    /**
     * 此处必须通过final修饰
     */
    private final WeFolderService weFolderService;

    @GetMapping
    public AjaxResult requestFolder(@RequestParam("resourceId") Integer resourceId) {
        FolderTree folderTree = weFolderService.requestFolder(resourceId);    //folderId相当于parent_id
        return AjaxResult.success(folderTree);
    }

}

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

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

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

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值