1 bootvue 2022-07-23 12:51:54 +08:00 用构造方法注入吧 配合 lombok 写起来还省事 |
![]() | 2 beginor 2022-07-23 13:06:41 +08:00 via Android 不推荐,建议使用构造函数注入 |
![]() | 3 KotlinAmai 2022-07-23 13:09:40 +08:00 构造器注入配合 lombok 的 @RequiredArgsConstructor 注解,挺省事的 |
![]() | 4 chendy 2022-07-23 13:14:24 +08:00 依赖全部 private final 再来一个 lombok 的 RequiredArgsConstructor 完事 |
![]() | 5 Akitora 2022-07-23 13:16:53 +08:00 via Android 构造注入+1 |
6 zed1018 2022-07-23 13:21:58 +08:00 service/component 构造注入,bean function 形参注入,可写可不写。 |
7 dcsuibian 2022-07-23 13:23:06 +08:00 ![]() |
8 fpure 2022-07-23 13:44:50 +08:00 ![]() 我不管,我就要用 Autowired 注入 |
![]() | 11 zjp 2022-07-23 14:09:10 +08:00 公司项目,经常一个 service 二三十个依赖项,还有循环依赖,不用字段注入会疯的... |
![]() | 15 vate32 2022-07-23 14:38:22 +08:00 表达的有问题吧,Autowired 就是用来注入的,但是可以用到字段、setter 方法、构造方法上,这些是有一些差别的 |
![]() | 16 vate32 2022-07-23 14:39:09 +08:00 注入方式的问题,我之前就有提问过 https://v2ex.com/t/713586#reply27 |
![]() | 17 wanguorui123 2022-07-23 14:46:23 +08:00 @Autowired 注入,@Scope("prototype") 创建实例 |
18 SpringChang 2022-07-23 14:49:49 +08:00 用 Spring 的话,@Autowired 很省事! |
19 fkdog 2022-07-23 14:55:13 +08:00 旧项目的话,因为存在大量循环引用依赖,private final 构造器注入(配合 lombok )会出现错误,因此还是用 @Autowired 。 |
21 unregister 2022-07-23 15:24:38 +08:00 不建议使用,@Autowired Spring 不推荐,但是呢大家都在用。构造器有利于进行单元测试。 |
22 nosugar 2022-07-23 15:29:50 +08:00 via iPhone 项目中用的还是挺多的 |
23 savingrun 2022-07-23 15:49:26 +08:00 建议使用构造函数注入 +1 配合 lombok 的 @RequiredArgsConstructor 例子: @Service @RequiredArgsConstructor public class xxxxServiceImpl implements xxxAppService, xxxAdminService { private final xxxxDao dao; } |
24 Bingchunmoli 2022-07-23 16:50:24 +08:00 via Android 普通用构造函数,循环依赖用 autowired , 没有谁更好只有谁更适合 |
26 fpure 2022-07-23 17:11:16 +08:00 ![]() 我不太理解,为什么有人愿意使用 Lombok 这种语法层侵入的库却排斥 Autowired |
27 kkkiio 2022-0723 17:30:11 +08:00 |
28 kkkiio 2022-07-23 17:32:40 +08:00 @kkkiio 用 Autowired 会遇到麻烦的最常见情景是单元测试,你要么暴露 Autowired 字段的 setter ,要么改成构造函数去初始化该字段 |
![]() | 29 mind3x 2022-07-23 18:41:36 +08:00 ![]() 看样子很多人不知道,单构造函数的类甚至不需要标注任何 `@Autowired`, Spring 默认就会从构造函数注入。 |
30 kaneg 2022-07-23 19:27:19 +08:00 via iPhone 的确知道应该使用构造方法而不是 Autowired ,但它就是顺手啊 |
![]() | 31 ychost 2022-07-23 20:37:59 +08:00 很多时候需要 require = false 方便点 |
![]() | 32 Oktfolio 2022-07-23 20:50:43 +08:00 我不用 |
![]() | 34 Rumble66 2022-07-23 21:29:49 +08:00 构造器注入不能够像 Autowired 那样解决循环依赖 另外有一点, 为什么说循环依赖的代码是烂代码呢? AB 两个服务相互调用不是很常见的事情吗? |
![]() | 35 wellerman 2022-07-24 01:07:18 +08:00 构造器注入+setter 注入,循环依赖都解决了。 |
36 Bingchunmoli 2022-07-24 01:13:22 +08:00 via Android @mind3x 通常没有构造方法 |
![]() | 38 11232as 2022-07-24 11:28:42 +08:00 构造器注入啊,写测试多舒服 |
40 bthulu 2022-07-24 12:13:02 +08:00 @unregister 有利个屁, 几十个依赖, 测某个方法用到其中一个依赖, 你一个个去数要塞到构造器第几个参数里么? |
![]() | 41 windyboy 2022-07-25 08:33:00 +08:00 最好在构造器注入 |
![]() | 42 siweipancc 2022-07-25 09:01:35 +08:00 via iPhone “最好”的选择在企业开发中往往崩,需求一个依赖一个的 |
43 jsdfzongkai 2022-07-25 09:12:41 +08:00 @dqzcwxb 确认是平替吗?知道两者区别不? |
44 dqzcwxb 2022-07-25 09:39:00 +08:00 @jsdfzongkai #43 @Resource 可以根据 name 和 type 查找 bean 不需要额外支持 @Autowired 默认只支持 type,需要和 @Qualifie 一起使用才能支持 name 查找 这不是平替什么是平替?你说的区别又指哪个? |
45 nothingistrue 2022-07-25 09:50:39 +08:00 不使用字段上的 @Autowired 的唯一好处是,去掉 Spring 后你仍然可以手动注入。这在 Spring 几乎不可能被去掉的前提下,属于过度设计。而且还是很严重那种,因为替代方式都有问题: 隐式构造器依赖注入(就是说得 private final + @RequiredArgsConstructor )需要有强的团队约定否则就严重影响代码可读性。 构造器注入容易出问题,而且参数多了会影响可读性 Setter 注入器因为 lombok 尚不能很好的支持,没法用。 |
46 jsdfzongkai 2022-07-25 10:07:15 +08:00 @dqzcwxb 默认注入方式都不同 何来的平替 |
47 dqzcwxb 2022-07-25 10:48:06 +08:00 @jsdfzongkai #46 @Resource 会根据 name 查找,查找不到会按照 type 查找 @Autowired 只能根据 type 查找,查找不到需要手动加上 @Qualifie 指定 name Resource 从功能上是大于等于 Autowired,你要是觉得还是不一样 你干脆说名字不一样得了 |
48 dqzcwxb 2022-07-25 10:53:18 +08:00 @nothingistrue #45 如果存在不使用 spring 的场景,更推荐使用 Resource 这是 javax 注解 |
49 jsdfzongkai 2022-07-25 10:55:20 +08:00 ![]() @dqzcwxb 不想跟你杠,只是不想你误导大家,现在你自己说清楚差别了,省的有些同学看到你上面的回复以为真的是平替 |