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