3

Spring 依赖注入最佳实践?

 2 years ago
source link: https://www.v2ex.com/t/835484
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Java

Spring 依赖注入最佳实践?

  tinotino654321 · 7 小时 7 分钟前 · 755 次点击
Spring 官方文档里推荐的是用 Constructor 注入,可选依赖用 Setter 注入。
但是实际在项目里一般用哪种注入呢?
我工作没多久,见到的大部分都是用 Field 注入。
22 条回复    2022-02-21 23:52:51 +08:00

chendy

chendy      6 小时 59 分钟前

final 字段 + 构造方法注入 + lombok 的 RequireArgsConstructor 注解
是不是最佳不知道,应该是字最少的
但是不能用来处理 RestTemplateBuilder 这样的特殊 bean

issakchill

issakchill      6 小时 50 分钟前

我也是用 1 楼的方法
有个难处理的地方是这个类的子类要手写构造方法,不知道有没有更方便的做法?

sutra

sutra      6 小时 39 分钟前

Constractor 注入的话,可以把 field 标记为 final ,其它的则不行。

fpure

fpure      6 小时 22 分钟前   ❤️ 3

我不管,我就要用 @Autowire 属性注入

Bingchunmoli

Bingchunmoli      6 小时 12 分钟前

官方推荐使用构造器,而旧项目和旧 Spring 用的比较多的是 autowired 和 resource , 都行,其实按推荐确实好点

7911364440

7911364440      6 小时 9 分钟前

Constractor+1

Oktfolio

Oktfolio      6 小时 9 分钟前

我是 Constractor + Setter

Oktfolio

Oktfolio      6 小时 8 分钟前

@Oktfolio 啊这,复制了楼上的 typo

giiiiiithub

giiiiiithub      5 小时 44 分钟前

如果依赖是创建对象时必须的,肯定是构造器注入。否则应该用 setter 注入,最次是 field 。

以上是基于:1. 依赖是否必须在构造对象时提供,2. 方便 mock

但实际使用使用是另一回事。用 spring 那一套,即便用 filed 注入一般也没什么问题

tinotino654321

tinotino654321      5 小时 28 分钟前

@sutra 实际上很少有依赖注入后会被修改的情况吧? final 其实也不是很重要?

sutrasutra      5 小时 22 分钟前

@tinotino654321 final 的目的是为了防止被修改,也可以从语义角度表示,不可以修改。

sutra

sutra      5 小时 22 分钟前

@Oktfolio 我发完就发现我的 typo 了,然而 V2EX 不能改。哈哈哈……

tinotino654321

tinotino654321      5 小时 21 分钟前

@giiiiiithub 我觉得 Field 注入最方便,但既是优点也是缺点。
优点是可以循环依赖,而且加依赖方便,不用改 Constructor 。
缺点是 Class 容易循环依赖,责任不清晰,并且依赖很多,容易形成屎山。
Mock 的话 Mockito 也可以 InjectMocks ,问题不是很大。

sutra

sutra      5 小时 16 分钟前 via iPhone

constructor 注入也能循环依赖,加 lazy 注解。

giiiiiithub

giiiiiithub      5 小时 2 分钟前

@tinotino654321 跟依赖循环没多大关系。主要是依赖应该不应该放在构造函数?能不能被 mock ? 你可以想象如果提供给外部使用,就需要问自己两个问题:1. 什么是必须的什么是可选的? 2. 什么是可以被修改的什么是不能被修改的?

liuxu

liuxu      4 小时 49 分钟前

新版的 idea 不是推荐 contractor 里面用 @autowired 注入么

WispZhan

WispZhan      4 小时 4 分钟前 via Android

必然是按官方来,不然提 PR 都过不了 bot

appstore54321

appstore54321      3 小时 28 分钟前 via Android

构造函数注入,写单元测试时就知道了,这样最方便 mock 。直接 autowired 一个成员这怎么测。

NotFoundEgg

NotFoundEgg      3 小时 12 分钟前

我一般用构造器注入
用 Autowired 注入 idea 会有警告,看着难受

leeg810312

leeg810312      3 小时 11 分钟前 via Android

顺便问下,service 接口实现按推荐的构造函数注入依赖,那么单元测试 mockito 怎么写比较好

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK