@Autowired 注入转换为构造器注入,导致的构造器代码臃肿,除了 Lombok 外还有别的解决方案吗?

2020-10-10 11:30:45 +08:00
 vate32
各博客文章说的都是要么使用 Lombok 的 @ RequiredArgsConstructor 注解,要么“考虑这个类是符合足单一职责原则了,将这个类拆分为多个类”。可是对于前者,项目不一定使用 Lombok,对于后者,实际业务情况可能使用很多个依赖类,拆分不太现实。请问还有别的优雅的解决方案吗?🤔
5634 次点击
所在节点    Java
28 条回复
NULL2020
2020-10-10 13:10:05 +08:00
为什么要换,@Autowired 不香吗?
clf
2020-10-10 13:30:47 +08:00
@NULL2020 构造器注入也是 @Autowired
vate32
2020-10-10 14:03:23 +08:00
@NULL2020 使用 Autowired 进行注入有空指针风险(例如在构造函数里使用了注入的对象,但是构造函数的调用优先于自动注入,此时调用就会抛出空指针错误),也不方便进行测试,Spring 官方也不推荐使用( Spring Team recommends "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".)。话说平常 IDE 的警告你们都不看的吗
vantis
2020-10-10 14:11:39 +08:00
心情好就去改改 如果是别人代码我就不动
(程序员怎么回去看 WARNING 233)
NULL2020
2020-10-10 14:17:29 +08:00
规则是死的,人是活的,怎么顺手怎么来
intmax2147483647
2020-10-10 14:19:21 +08:00
@NULL2020 顺手写一个 BUG😂
gdtdpt
2020-10-10 14:21:28 +08:00
看场景吧,也不是说一定不能用非构造器注入的方式,如果你确实需要在一个 bean 的构造函数中做些什么,才需要把相关的 bean 以构造器注入的方式注入到当前实例。
如果不想这样,那也可以注入 ApplicationContext,具体需要的 Bean 可以从 ApplicationContext 中获取,但是这样做也有可能获取的 Bean 为 null 。
所以我觉得如果没遇到注入的 Bean 为 null 的情况下,setter 注入,field 注入还是 constructor 注入三种方式不必太纠结,当真正遇到了问题再去分析 bean 的 生成顺序和代码的执行顺序比较好。
Jooooooooo
2020-10-10 14:22:04 +08:00
臃肿的缺点是?
hpashencedany1
2020-10-10 14:27:26 +08:00
拆吧, 我在慢慢拆
sheng3233386
2020-10-10 14:49:39 +08:00
我们都用 @Resource
Resource
2020-10-10 14:55:03 +08:00
@sheng3233386 #10 谢邀
Boyce
2020-10-10 15:23:35 +08:00
@Resource 哈哈哈哈
chendy
2020-10-10 15:32:20 +08:00
感觉这个注入就是配合 lombok 最舒服
不过确实有些场景不能用,比如 RestTemplateBuilder 这种
不过反正可以自动生成自动补全
如果一个 bean 要注入的 bean 太多了,考虑重构一下吧
xiangyuecn
2020-10-10 15:33:36 +08:00
@Resource 这个注解确实牛逼
MatthewHan
2020-10-10 15:48:42 +08:00
@NULL2020 #1 Autowired 都要被淘汰了
vate32
2020-10-10 16:10:21 +08:00
@Jooooooooo 臭长臭长的,构造函数参数列表很长,不好维护(个人观点)。

@sheng3233386 直接使用名称的吗,但是这个能够避免上面说的空指针错误吗,好像跟直接使用 autowired 是一样的。

@chendy 写着着实很爽,但是担心有的地方不让用 Lombok (似乎想多了)

@gdtdpt 多谢大佬指点,还是得看实际情况来。从 ApplicationContext 获取到 Bean 的方法还没用到过,去学习一下。
yuhaoyang222
2020-10-10 16:49:51 +08:00
建造者模式
STRRL
2020-10-10 16:50:03 +08:00
不清楚 lz 这个问题是在刚刚想做还是已经做一段时间了,不知道有没有遇到过循环依赖的问题。

constructor 注入需要你先有一个 constructor, 所以手写一个也好 lombok 生成一个也好,还是 IDEA command+N generate 一个也好,都是不错的选择。

我 jio 得循环依赖才是无法使用 constructor 注入的罪魁祸首,毕竟即使你的 constructor 需要的参数再多,也就是一个注解或者一个快捷键自动生成的事。由于设计上的失误导致的循环依赖会使你压根用不了构造器注入,而且有循环依赖的项目多多少少会有其他的 badsmell ...(破窗。。。
linvaux
2020-10-10 16:57:41 +08:00
公司禁止使用 lombok,而且,这玩意儿代码能有多冗余?只是自己强迫症发作了吧
Aresxue
2020-10-10 17:13:45 +08:00
一般无非就还是插件, idea 官方能出个功能是最好的,虽然构造器更好但如果没有其他配合还是用 field 注入吧,至少不用在新加服务后还要改构造器

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX