1
chendy 2022 年 2 月 21 日
final 字段 + 构造方法注入 + lombok 的 RequireArgsConstructor 注解
是不是最佳不知道,应该是字最少的 但是不能用来处理 RestTemplateBuilder 这样的特殊 bean |
2
issakchill 2022 年 2 月 21 日
我也是用 1 楼的方法
有个难处理的地方是这个类的子类要手写构造方法,不知道有没有更方便的做法? |
3
sutra 2022 年 2 月 21 日
Constractor 注入的话,可以把 field 标记为 final ,其它的则不行。
|
4
sutra 2022 年 2 月 21 日 |
6
Bingchunmoli 2022 年 2 月 21 日
官方推荐使用构造器,而旧项目和旧 Spring 用的比较多的是 autowired 和 resource , 都行,其实按推荐确实好点
|
7
7911364440 2022 年 2 月 21 日
Constractor+1
|
8
Oktfolio 2022 年 2 月 21 日
我是 Constractor + Setter
|
10
9c04C5dO01Sw5DNL 2022 年 2 月 21 日
如果依赖是创建对象时必须的,肯定是构造器注入。否则应该用 setter 注入,最次是 field 。
以上是基于:1. 依赖是否必须在构造对象时提供,2. 方便 mock 但实际使用使用是另一回事。用 spring 那一套,即便用 filed 注入一般也没什么问题 |
11
tinotino654321 OP @sutra 实际上很少有依赖注入后会被修改的情况吧? final 其实也不是很重要?
|
12
sutra 2022 年 2 月 21 日
@tinotino654321 final 的目的是为了防止被修改,也可以从语义角度表示,不可以修改。
|
14
tinotino654321 OP @giiiiiithub 我觉得 Field 注入最方便,但既是优点也是缺点。
优点是可以循环依赖,而且加依赖方便,不用改 Constructor 。 缺点是 Class 容易循环依赖,责任不清晰,并且依赖很多,容易形成屎山。 Mock 的话 Mockito 也可以 InjectMocks ,问题不是很大。 |
15
sutra 2022 年 2 月 21 日 via iPhone
constructor 注入也能循环依赖,加 lazy 注解。
|
16
9c04C5dO01Sw5DNL 2022 年 2 月 21 日
@tinotino654321 跟依赖循环没多大关系。主要是依赖应该不应该放在构造函数?能不能被 mock ? 你可以想象如果提供给外部使用,就需要问自己两个问题:1. 什么是必须的什么是可选的? 2. 什么是可以被修改的什么是不能被修改的?
|
18
WispZhan 2022 年 2 月 21 日 via Android
必然是按官方来,不然提 PR 都过不了 bot
|
19
honamx 2022 年 2 月 21 日
@RequiredArgsConstructor + private final
|
20
appstore54321 2022 年 2 月 21 日 via Android
构造函数注入,写单元测试时就知道了,这样最方便 mock 。直接 autowired 一个成员这怎么测。
|
21
NotFoundEgg 2022 年 2 月 21 日
我一般用构造器注入
用 Autowired 注入 idea 会有警告,看着难受 |
22
leeg810312 2022 年 2 月 21 日 via Android
顺便问下,service 接口实现按推荐的构造函数注入依赖,那么单元测试 mockito 怎么写比较好
|
23
Kontinue 2022 年 2 月 22 日
@NotFoundEgg 同,idea 推荐哪种方式用哪种哈哈哈,不然全是波浪线和 warning 很难受。人家既然给出提示肯定是有他的必要性的
|
24
thetbw 2022 年 2 月 22 日
@appstore54321 我们从没写过单元测试😅
|
25
chendy 2022 年 2 月 22 日
@leeg810312 直接 @ Mock 定义 mock 依赖,然后自己把 service new 出来
|
26
hingbong 2022 年 2 月 22 日
kotlin 表示一般用 constructor, 偶尔是 setter
|
29
summerLast 2022 年 2 月 22 日
同一楼 final 字段 + 构造方法注入 + lombok 的 RequireArgsConstructor 注解
补 需要 注入值的 或 特殊的 不用 final 修饰 自己手动加对应注解 |
30
MarkLazy 2022 年 2 月 22 日
@sutra 这篇文章讲了 constructor 注入可以防止空指针,但是我试了 `@AutoWired/@Resource` 注解,用这两个注解时,缺依赖的话 springboot 都启动不起来,所以不管是构造器注入还是字段注入都不会造成空指针啊
|
32
hambers 2022 年 2 月 22 日
构造器注入 如果以来的注入对象很多的话,构造方法不是参数很多的样子。 强迫症看着有点不舒服,有啥好办法么
|
34
banmuyutian 2022 年 2 月 22 日
@hambers #32
lombok 注解 |
35
xuanbg 2022 年 2 月 22 日
field 注入最简单,但安全性不太好。我都是用构造器注入,这样不会飘红,强迫症你们不用学。
|
37
NotFoundEgg 2022 年 2 月 22 日
@hambers
Lombok 的 RequireArgsConstructor 注解可以解决这个问题,但从设计上来说一个类注入了过多的对象,可能违背了单一职责原则(虽然实际上来说这种情况确实特别常见🤣) |
38
wolfie 2022 年 2 月 22 日
@appstore54321 #20
单元测试时候 脱离 spring ? |
39
dcsuibian 2022 年 2 月 22 日
Constractor ,因为 idea 不会有波浪线。(测试的那里不会有)
循环依赖用 settter |
41
cheng6563 2022 年 2 月 22 日
构造器注入的话 如果循环依赖会炸掉
|
42
shanghai1943 2022 年 2 月 22 日
构造器注入的话,万一是需要注入很多 bean 咋整。。不得写一长串么
|
43
zzfer 2022 年 2 月 22 日 @shanghai1943 我们使用的 lombok 的 RequireArgsConstructor 注解
|
44
shanghai1943 2022 年 2 月 22 日
@zzfer 👍学习了。
|
46
zhady009 2022 年 2 月 22 日
用构造器就行了 写多了就明白为什么 也能一定程度上把控代码质量
|
47
hambers 2022 年 2 月 22 日
@banmuyutian 如果 有几个待注入的 field 有循环以来需要 lazy 一下 咋整呢? 能在 final field 上加 @lazy 么
|
48
Loku 2022 年 2 月 22 日
Constructor 注入
|
49
NeoZephyr 2022 年 2 月 23 日
不知道为啥不推荐 field 注入。如果全部用构造器注入的话,会遇到循环依赖的
|