You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中@Autowired违背DRY原则且依赖过多,该如何优化?

如何解决Spring中@Autowired违背DRY原则的问题?

确实,你提到的痛点太真实了——字段注入要给每个依赖都加一遍@Autowired,完全违反DRY;手动写构造方法注入吧,依赖多了之后构造方法又长又臃肿,维护起来头疼。下面给你两个最实用的解决方案,尤其是第一个,现在已经是Spring项目里的主流做法了:

方案一:用Lombok的@RequiredArgsConstructor + Spring 4.3+的自动构造注入

这应该是目前最优的解决方案,完美兼顾简洁性和规范。

原理:

  1. Spring 4.3及以上版本有个贴心特性:如果你的Bean类只有一个构造方法,Spring会自动用这个构造方法完成依赖注入,不需要额外加@Autowired。
  2. Lombok的@RequiredArgsConstructor注解会自动帮你生成一个包含所有final修饰字段的构造方法——你不用手动写那一大串构造代码。

改造后的代码:

把你原来的字段注入代码:

public class SomeController { 
    @Autowired private SomeService1 someService1; 
    @Autowired private SomeService2 someService2; 
    @Autowired private SomeService3 someService3; 
}

改成这样:

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor // 关键注解
public class SomeController { 
    // 给依赖字段加上final,Lombok会自动为它们生成构造方法
    private final SomeService1 someService1;
    private final SomeService2 someService2;
    private final SomeService3 someService3;
}

就这么简单!没有重复的@Autowired,也没有臃肿的构造方法,同时还保留了构造注入的所有优点:

  • 依赖关系一目了然(从类的结构就能看到需要哪些依赖)
  • 支持final字段,保证依赖不可变
  • 单元测试时可以直接手动传入依赖实例,不需要依赖Spring容器

注意事项:

  • 项目里要先引入Lombok依赖,比如Maven:
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
  • 你的IDE需要安装Lombok插件(IntelliJ IDEA、Eclipse都有对应的插件),否则可能会出现编译警告或者找不到构造方法的提示。

方案二:构造方法上只加一次@Autowired

如果不想引入Lombok,也可以用这个方案——只在构造方法上加一次@Autowired,不用给每个字段都加,比字段注入更符合DRY原则。

示例代码:

public class SomeController { 
    private final SomeService1 someService1;
    private final SomeService2 someService2;
    private final SomeService3 someService3;

    // 只需要在构造方法上加一次@Autowired
    @Autowired
    public SomeController(SomeService1 someService1, SomeService2 someService2, SomeService3 someService3) {
        this.someService1 = someService1;
        this.someService2 = someService2;
        this.someService3 = someService3;
    }
}

这个方案虽然还是要手动写构造方法,但至少不用重复加@Autowired了,而且同样具备构造注入的优势。不过依赖多的时候构造方法还是会很长,所以还是推荐方案一。

为什么不推荐字段注入?

顺便提一句,字段注入除了违反DRY,还有其他问题:

  • 不能注入final字段,无法保证依赖的不可变性
  • 依赖关系隐藏在字段里,不看代码细节不知道类需要哪些依赖
  • 单元测试时必须依赖Spring容器,没法手动注入Mock对象,测试不够灵活

所以无论是从DRY原则还是代码质量角度,构造注入(结合Lombok)都是更好的选择。

内容的提问来源于stack exchange,提问作者Bogdan Lukiyanchuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:45:47