这是经典的“配置与约定”问题。在大多数情况下,个人品味决定了答案。然而,就我个人而言,我更喜欢配置(即基于 XML)而不是约定。IMO IDE 的健壮性足以克服人们经常将构建和维护基于 XML 的方法联系在一起的一些 XML 地狱。最后,我发现从长远来看,Configuration 的好处(比如构建用于构建、维护和部署 XML 配置文件的实用程序)要大于惯例。
例如,如果使用 Spring,在应用程序的依赖注入部分使用 XML 是完全直观的。这使代码的依赖性远离将要使用它的代码,相比之下,在需要依赖性的代码中使用某种注释可以使代码意识到这种自动配置。
但是,不使用 XML 进行事务管理,而是使用注释将方法标记为事务性的,这非常有意义,因为这是程序员可能希望了解的信息。但是接口将被注入为 SubtypeY 而不是 SubtypeX 不应该包含在类中,因为如果现在你想注入 SubtypeX,你必须改变你的代码,反正之前你有一个接口协议,所以对于 XML,你只需要改变 XML 映射,这样做是相当快速和轻松的。
我没有使用过 JPA 注释,所以我不知道它们有多好,但是我认为将 bean 映射到 XML 数据库也是好的,因为对象不应该关心它的信息来自哪里,它应该只关心它能用它的信息做什么。但是如果你喜欢 JPA (我没有任何使用它的经验) ,无论如何,去做吧。
一般来说:
如果一个注释提供了功能,并且它本身就是一个注释,并且没有将代码绑定到某个特定的过程中,以便在没有这个注释的情况下正常运行,那么可以使用注释。例如,标记为事务性的事务性方法不会杀死其操作逻辑,而且还可以作为良好的代码级注释。否则,这些信息可能最好用 XML 表示,因为尽管它最终会影响代码的操作方式,但它不会改变代码的主要功能,因此不属于源文件。
对于 Spring 框架,我喜欢这样的想法,即能够使用@Component 注释并设置“组件扫描”选项,这样 Spring 就可以找到我的 java bean,这样我就不必用 XML 或 JavaConfig 定义所有的 bean。例如,对于只需要连接到其他类(理想情况下通过接口)的无状态单例 java bean,这种方法非常有效。一般来说,对于 Spring bean,我已经在很大程度上放弃了 Spring XML DSL 来定义 bean,现在更倾向于使用 JavaConfig 和 Spring 注释,因为可以对配置进行一些编译时检查,还可以获得一些 Spring XML 配置无法提供的重构支持。在某些罕见的情况下,我发现 JavaConfig/Annotations 不能完成使用 XML 配置可以完成的任务,因此我将两者混合使用。