Spring4.x推荐使用java配置

作者:陆金龙    发表时间:2024-02-24 06:39   

关键词:  

作者:有铭
链接:https://www.zhihu.com/question/278435266/answer/400391692
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

曾经有段时间Java的生态圈走了极端,为了彻底的解耦,把“什么时候需要什么样的实现”这个问题的解决方案,写在配置文件(也就是xml里),因为xml不需要重新编译,因此达成了“彻底解耦”这个目标(我需要什么实现我就改配置文件就行了,不需要改代码,不需要重新编译),然而随着时间的发展,人们发现了以下问题,1.大部分时候我们并不需要解耦的如此彻底,应用级程序甚至很少遇到要到要换接口实现。2,xml的配置学习起来门槛太高了,就算老手看一个配置文件经常也能看的云里雾里,再加上xml文件不能做类型检查,有时候你实际上是把一个错误的类装配进接口,导致系统报错,你却要找半天错误。因此这几年提出了新的口号叫“约定大于配置”,javaconfig实际上就是约定大于配置的产物,它做的事情和xml配置几乎相同,但是因为有类型检查且本身就是java代码的原因,它的可读性和可维护性远高于xml配置,新手接手项目的门槛大大降低。而代价不过是放弃那天知道什么时候才可能用的上“彻底解耦”的能力。所以是值得的

我是完整经历过这段时期的人,后来我就明白有的时候设计是不能过度,要根据场景来,架构不是设计出来的,是迭代出来的,而迭代依据的标准,就是你遇到的场景。

 

我从指称语义 (denotational semantics) 的角度讲一下.

过去语言表达能力弱鸡, 分析工具弱鸡, 所以把一部分代码写到 XML 里是一种隔离 concern 的手段. 配置文件可以看作抽离了代码在某种 domain 的语义.

现在呢? 语言表达能力增强了, 有更多的方式组织和变换代码 (例如改变 annotation 的语义, 甚至改变 AST 的语义), 把代码的一部分分离到别的包里去也变得更容易了, 框架开发者对代码变换的掌握程度也提高了.

分析工具也增强了, 如果想要查看某种 annotation 的所有使用点, 直接做个语义搜索即可, 所以也没必要手动把配置都放一起了.

另一方面, 配置文件的缺点越来越明显. 要写 XML schema 去指定语法, 然后配置值还得做类型转换, 仅仅满足 XML schema 是不能满足正确性的, 背后的配置正确性校验依然省不掉. 配置文件重构困难, 升级困难, 变成了越来越大的技术债.

最后, 最重要的: 随着只会用 XML 配置的老人慢慢退休转岗, 更好的配置办法终于占了主流, 最后也就比 Ruby on Rails 晚了十几年而已.