Java 开发注解会入侵代码吗?

2019-08-30 08:53:41 +08:00
 qdyoungk

java 开发注解会入侵代码吗?昨晚架构在代码走查时点了一个人的代码,告诉我们他是尽量不想用注解的, 如 @Autowired,他会推荐用 set 写。 他说到“用注解,我们的项目打出的包给别人用时,别人可能只要一个功能,但是我们就要把全部路径暴露给别人”。 我不太懂这句话是什么意思,麻烦大佬们给个解释。 另外,如 lombok 的 @Slf4j,这个好还是手写的 getLogger 好?和上面的问题有关系吗?

7272 次点击
所在节点    Java
32 条回复
wysnylc
2019-08-30 11:16:06 +08:00
@Aresxue #9 构造器存在强制依赖问题,如果发现无法注入整个项目都无法启动也无法在运行是修改注入的 bean,当多个构造器(5 个以上)时代码会变得很难看
构造器虽好,但是不建议使用
notreami
2019-08-30 11:20:46 +08:00
反射+字节码,什么 java 代码不能暴露??
vjnjc
2019-08-30 11:36:13 +08:00
应该就是 9 楼说的,用 @会使得这段代码复用性不够强,可以用 set 或者构造函数(推荐)。
这样的话这个类就没有 annotation 的 import 了,也就没有 spring 的依赖了。不过相信我,这种复用性大部分情况都用不上,很难用场合会迁移到一个没有 spring 的项目里
passerbytiny
2019-08-30 11:52:12 +08:00
@vjnjc #21 要没有 annotation,你必须使用 xml,否则你最起码要有一个 @Component
luozic
2019-08-30 13:39:45 +08:00
扯犊子呢,封装和开闭是放这里的?
Takamine
2019-08-30 14:46:17 +08:00
没看懂 Autowire 怎么了,说到 lombok 倒是团队里被禁用了。
这一翻开代码里面都是 Configuration,FeignClient,EnableHystrix 这些注解的那不是炸了。:doge:
chendy
2019-08-30 14:48:18 +08:00
@wysnylc 组件类有很多构造方法是啥场景?…
heian0224
2019-08-30 18:02:38 +08:00
我觉得应该是不用变量直接注入,而是通过构造器注入。这个 spring 是这样推荐的
aguesuka
2019-08-31 02:08:13 +08:00
注入有三种方法,其一是 field 注入,缺点耦合 spring。其二是构造器,缺点是不能循环引用。其三是 setter,我没找到怎么用 idea 生成,而且 setter 太啰嗦。
我觉得 java 应该从语法层次解决配置文件,依赖注入,aop,日志的问题,就像 jdbc 一样。感觉很多 jvm 可以做的东西都由框架去实现了。
br00k
2019-08-31 09:26:18 +08:00
@aguesuka 构造方法可以循环引用,添加 @Lazy 注解。不过出现这种问题首先要考虑代设计是不是有问题。
Aresxue
2019-09-02 09:38:56 +08:00
@wysnylc 正是为了强制注入,不然实际运行时注入失败还可以正常启动但业务代码还会报 npe, 当然在前期开发中使用 field 也无可厚非,相互之间可以独立,因为注入本身此时也变动的十分频繁,但当项目进入正常的迭代周期了,就不应该使用此种方式。构造器注入使得注入的服务不可变, 在实际的代码运行可以规避很多问题, 此外 5 个以上的依赖使得代码过于臃肿, 这时候应该考虑下设计模式了,为什么你会有这么多的服务要注入, 是不是拆分的不够细, 一个拥有 5 个注入以上的类大概率本身就很臃肿。当然在传统行业中业务本身确实及其复杂,但实际中仍不应该随意复用,举个极端的例子,我有一个列表查询, 我已经有了一个单个的查询,此时要不要复用是有待商榷的而不是无脑复用, 我见过有人为了复用竟然单个的查询也用列表查询查出来然后再取出来,完全罔顾了列表查询中不必要的操作和数据库更大的耗时。
Asimov01
2019-09-02 22:10:55 +08:00
居然还真有 Autowired 这么一个人,哈哈哈哈哈哈哈哈

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

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

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

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

© 2021 V2EX