在最近我从事的一些大型项目中,选择其中一个(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。
我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势?
在最近我从事的一些大型项目中,选择其中一个(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。
我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势?
Answers:
注释有其用途,但它们并不是杀死XML配置的灵丹妙药。我建议将两者混合!
例如,如果使用Spring,则将XML用于应用程序的依赖项注入部分是完全直观的。相比之下,这使代码的依赖关系脱离了将要使用它的代码,相反,在代码中使用某种需要依赖关系的注释使代码知道这种自动配置。
但是,不是将XML用于事务管理,而是将方法标记为带有注释的事务是很有意义的,因为这是程序员可能希望知道的信息。但是,不应将接口作为SubtypeY而不是SubtypeX插入类中,因为如果您现在想注入SubtypeX,则必须更改代码,而无论如何您都必须先进行接口协定,所以使用XML,您只需要更改XML映射即可,而且这样做非常快捷,轻松。
我没有使用过JPA批注,所以我不知道它们的优劣,但是我认为将bean的映射关系保留为XML也很好,因为该对象不必关心其信息来自何处。 ,它应该只关心它可以使用其信息做什么。但是,如果您喜欢JPA(我对此没有任何经验),则一定要这样做。
一般而言:如果注释提供功能并本身充当注释,并且不将代码绑定到某些特定过程以在没有此注释的情况下正常运行,请使用注释。例如,标记为事务性的事务方法不会破坏其操作逻辑,并且还可以充当良好的代码级注释。否则,此信息最好用XML表示,因为尽管它最终会影响代码的运行方式,但不会更改代码的主要功能,因此不属于源文件。
我已经使用Spring几年了,所需的XML数量肯定变得乏味。在Spring 2.5中新的XML模式和注释支持之间,我通常会执行以下操作:
使用“ component-scan”来自动加载使用@ Repository,@ Service或@Component的类。我通常给每个bean一个名称,然后使用@Resource将它们连接在一起。我发现该管道不会经常更改,因此注释是有意义的。
对所有AOP使用“ aop”命名空间。这确实很棒。我仍然将其用于事务处理,因为将@Transactional放在所有位置都是一种拖累。您可以为任何服务或存储库上的方法创建命名切入点,并很快应用建议。
我将LocalContainerEntityManagerFactoryBean和HibernateJpaVendorAdapter一起使用来配置Hibernate。这使Hibernate可以轻松地在类路径上自动发现@Entity类。然后,使用引用LCEMFB的“ factory-bean”和“ factory-method”创建一个名为SessionFactory的bean。
还有其他方面需要比较,例如重构和其他代码更改。使用XML时,要花费大量精力进行重构,因为您必须照顾所有XML内容。但是使用注释时很容易。
我的首选方式是没有注释(或最少注释)的基于Java的配置。http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java
总是要链接到特定Java组件(类,方法或字段)的配置信息是用注释表示的很好的候选者。当配置是代码目的的核心时,注释在这种情况下特别有效。由于注释的限制,最好是每个组件只能有一个配置。如果您需要处理多种配置,特别是那些以包含注释的Java类之外的任何条件为条件的配置,则注释可能会产生比其解决的问题更多的问题。最后,在不重新编译Java源代码的情况下不能修改注释,因此任何需要在运行时重新配置的内容都不能使用注释。
请参考以下链接。它们也可能有用。
这是经典的“配置与约定”问题。在大多数情况下,个人品味决定了答案。但是,我个人更喜欢Configuration(即基于XML)而不是Convention。IMO IDE具有足够的鲁棒性,足以克服人们经常与建筑相关的XML地狱,并维护基于XML的方法。最后,从长远来看,我发现Configuration的好处(例如构建用于构建,维护和部署XML配置文件的实用程序)的好处超过了Convention。
根据我的经验,注释配置有一些优点和缺点:
我更喜欢将两种方法结合使用-Java注释和必要的xml最小化(最小化配置)。
对于Spring Framework,我喜欢这样的想法:能够使用@Component批注并设置“ component-scan”选项,以便Spring可以找到我的Java bean,这样就不必在XML中定义所有bean,也不必在XML中定义所有bean。 JavaConfig。例如,对于仅需要(理想情况下通过接口)连接到其他类的无状态单例Java bean,此方法效果很好。总的来说,对于Spring bean,我大部分时候都不再使用Spring XML DSL来定义bean,现在更喜欢使用JavaConfig和Spring Annotations,因为您可以对配置进行编译时检查,并且可以得到一些重构支持。无法获得Spring XML配置。在某些罕见的情况下,我确实将两者混为一谈,因为我发现JavaConfig / Annotations无法完成使用XML配置的可用功能。
对于Hibernate ORM(尚未使用JPA),我仍然更喜欢XML映射文件,因为域模型类中的注释在某种程度上违反了Clean Architecture。,即我过去几年采用的分层体系结构样式。发生违规是因为它要求核心层依赖于与持久性相关的事物(例如Hibernate或JPA库),并且使域模型POJO的持久性少了一些。实际上,核心层根本不应该依赖于任何其他基础架构。
但是,如果“清洁架构”不是您的“杯茶”,那么我可以看到在域模型类中使用Hibernate / JPA批注而不是单独的XML映射文件绝对具有优势(例如便利性和可维护性)。
@Component
和@Autowired
,这是错误的二分法。还有其他创建配置的方法,包括JavaConfig和groovy config。