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

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

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

7246 次点击
所在节点    Java
32 条回复
qping
2019-08-30 09:05:50 +08:00
lombok 是改字节码的,你把 class 反编译可以看到,它给你加了一句 getLogger,和你手写是一样的效果
qdyoungk
2019-08-30 09:09:48 +08:00
@qping 嗯。那这种注解会造成上面说的那种“暴露路径”或者“代码入侵”吗?
qping
2019-08-30 09:09:51 +08:00
你同事真的理解注解的原理和怎么用了吗
liuxey
2019-08-30 09:12:06 +08:00
胡扯,@Autowired 会暴露,set 就不会了?

好好让他理解下 Spring Boot autoconfiguration 精髓

说到 Lombok,连原理都没搞清楚,就说手写 Logger ?

你们的架构可能很有"经验",但他已经走进自我感觉良好的死路
nnnToTnnn
2019-08-30 09:14:20 +08:00
我是真的不太明白你同事说的话,注解不过是运行时候的一个标志,本身不起任何作用,起作用的是注解解析器。


至于你说的“暴露路径”或者“代码入侵”,这些东西和用注解无关吧,提供 sdk,都可以反编译代码了,你觉得。


话说你同事真的是 Java 出身? 感觉不像 Java 开发的,Java 开发都是 spring boot 用也得用,不用也得用,不然都无法启动
lzxz1234
2019-08-30 09:15:06 +08:00
首先,注解是代码的一部分,不是配置项,所以根本没有入侵代码的问题,它本身就是代码

然后,具体场景具体分析,如果是提供给别人用的代码,尽量连 spring 都不要用,因为别人的项目可能并不是 spring 管理的,或者可能是其它版本管理的,容易引起冲突或者其它问题。

至于 “全体路径暴露” 的问题不是很明白,你把包打给别人了,你能 set 别人也能,根本解决不了问题,最多做到默认不加载

lombok 这个老话题了,看团队,要么所有人都用,要么所有人都不用
hangszhang
2019-08-30 09:17:58 +08:00
都 9102 年了,springboot 的大版本都到 2 了,还有人说这种话
chendy
2019-08-30 09:18:25 +08:00
autowired 用 set 写是啥意思?
项目打包给别人的场景确实和自己用的场景不一样,需要区别对待,但是感觉没说到点上
Aresxue
2019-08-30 09:21:51 +08:00
spring3.0 以前的注解会有入侵,但入侵不是因为注解而是对注解的业务处理对整个系统的耦合。在 spring 5.0 以上可以放心大胆的使用,set 方法一般还是搭配 xml 配置使用,xml 配置这东西能不用还是不用的好(但其功能的强大目前诸多配置仍旧比不上,这也是目前虽然在去 xml'化但仍然效果不甚理想的原因),set 代码本身也是极其无用的代码,代码这东西越少 bug 也就越少问题也更好定位。同时不推荐使用 AutoWired 进行 field 注入,尽量使用构造器注入。
qdyoungk
2019-08-30 09:31:13 +08:00
谢谢各位大佬,提到的很多名词我正查个不停。。谢谢!
passerbytiny
2019-08-30 09:35:11 +08:00
你同事说得那么玄乎,但我不知道他在说什么。

@Autowired 要是写在变量上,同时又不提供 set 方法(包括通过构造方法 set ),那么这个类离开了 Spring 将无法自举,即你直接 new 出来的对象,是无法使用的,@Autowired 的变量永远是 null。Spring 官方推荐的做法是,@Autowired 放到构造器或者 set 方法上,这样即使脱离了 Spring,你这个类还能通过 new 方法实例出一个可用的对象。这里还有另一层含义,传统的依赖注入概念,是让容器 new、set 之后把 bean 给你,后者是符合这种传统概念的,这意味着你的依赖注入容器,可用方便地从 Spring 换成其它容器。

But,Java 不用 Spring 是个伪命题,@Autowired 写在变量上能极大地提高代码可读性,以及更重要地,重构方便性。

另外只写 set 方法但是不加 @Autowired 注解,是一种严重影响代码可读性地行为,它要求读代码的人必须知道“ Spring 会通过反射扫描到该方法,进而知道这是用来做注入的”,否则将会非常困惑“这叼变量是怎么注入的”。

lombok.@Slf4j 与上面没关系,但是 lombok.@Setter 与 @Autowired 有关系,用了 @Setter,你源代码就没有 set 方法了,自然也没办法在 set 方法上加 @Autowired,lombok 尝试解决这种冲突,但到目前为止实现方式还是很丑陋。
x66
2019-08-30 09:43:05 +08:00
Spring 官方在 3.x 的时候是推荐使用 set 注入的,但现在已经是 5.x 了,官方推荐使用构造器注入,所以你们的架构或许还在使用过时的经验?
BigDogWang
2019-08-30 09:46:35 +08:00
我大致懂了一点了,Autowired 会要求 bean 必须 public,set 则无这样要求,你同事应该是这么考虑的
sambawy
2019-08-30 09:47:47 +08:00
springboot 的出现就是为了消灭配置里面大量 xml 的,xml 多可读性差,springboot 现在都已经到 2.x 版本了,应该来说是经过了实践验证过的东西了,你的同事是不是太过于保守
BigDogWang
2019-08-30 09:55:57 +08:00
是我学艺不精了。Bean 也可以 package-privage
90d0n
2019-08-30 10:06:22 +08:00
@Autowired 这老哥被你们这么艾特, 会不会烦得要死
eGlhb2Jhb2Jhbw
2019-08-30 10:07:56 +08:00
@Autowired 出来聊聊,哈哈哈哈哈
optional
2019-08-30 10:14:55 +08:00
private autowired 确实破坏了封装性,也破坏了离开 spring 的可能性,而且搞得代码到处都是 import spring,推荐直接 @allArgsConstructor
mosliu
2019-08-30 10:15:45 +08:00
@Autowired 现在 springboot 推荐的是构造里注入吧

其实上面讲的挺好的 回复这条主要是想 at 一下 Autowired 兄
no1xsyzy
2019-08-30 11:15:40 +08:00
看看 @Override 你们就知道了,这些喜欢把 @ 常跟的东西当名字的就是想知道谁在谈论这事

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

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

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

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

© 2021 V2EX