在日常开发中,我们大家什么时候感受使用注解最多呢?当然是在各种JavaEE框架的配置中,我们很明显感受到以前很多框架的老版本都是使用的XML文件做配置,而今很多框架的新版本都改成了支持注解配置的方式。
那么,注解真的可以用来完全替代XML吗?它们各自的优势是什么?什么时候我们要使用注解配置?什么时候使用XML配置呢?
综述
我们先来看看这两幅图:
我们发现两种技术是具有非常大的相似度的。虽然它们的出身、语法完全不同,但是每个阶段的目的是非常的相近。
- 第一个阶段都是定义可以使用的标记、每个标记的属性,标记的嵌套关系(特别提醒:这表明注解里面的某些属性又是一个注解,从而带来嵌套效果)。说白了就是定义一种存放配置数据的格式;
- 第二个阶段就是具体的配置阶段,区别在于:XML是一篇独立的文本文件,有它自己的语法格式;注解是直接写在Java文件身上,是属于Java的语法体系;
- 第三个阶段都是在运行期读取配置信息。XML的解析需要使用到诸如像DOM4J,JDOM等这样的第三方类库,较为麻烦;注解则可以更方便的直接使用Java本身的反射技术进行,相对而言简单一些。
接下来,我们在具体看看这两种技术:
XML
XML全称叫做:可扩展标记性语言(eXtensible Markup Language)。它是W3C组织于1998年2月提出的一种SGML(标准通用标记语言)的一个子集。最初的目的是为了能够替代当时的HTML(超文本标记性语言),解决HTML的语法不标准、可扩展性差等问题。后来,XML由于是一种独立的文本格式,而它的语法又能够很丰富的表达各种数据结构,所以又被大量用来作为不同平台之间数据传递的标准格式。它的使用越来越广泛,包括WebService、AJAX等都是基于它的,所以配置文件只是XML的一种用途而已。
注解
注解Annotation是Java在JDK1.5中提供的一种新类型。它是在Java代码中的特殊标记,这些标记可以在编译、类加载或运行期被读取,从而执行相应的特殊操作。所以,注解Annotation是Java语言独有的,只能Java用,并且其设计目的就是为了做配置的。
综合比较
从以上描述中,我们可以很明显发现Java的注解与XML就不是一个等量级的对手。XML的用途比Java的注解要广泛的多,它不限于语言,只要需要表示数据的地方都可以使用,这是Java注解绝对不可比拟的。所以,Java注解要替代XML是不可能的。
那么我们把比较的场景替换成Java代码开发中的配置呢?在这种情况下,Java开发人员或设计人员会更偏向于使用哪一个呢?我们接着聊……
XML配置的优缺点
优点
- 可扩展性强。由于XML是可以自定义标记、属性和嵌套关系的,而且它的定义文件(DTD、Schema)也都是文本文件而已,所以添加或修改都更为方便;
- 满足开闭原则。XML的配置文件是独立于Java代码之外的,所以如果要修改配置是不需要动到Java代码的;
缺点
- 解析麻烦,需要第三方类库配合;
- 配置文件过多后,会导致项目管理、维护等行为变得困难;
- 在做代码的关联配置的时候麻烦,会让开发人员不断的在Java代码和XML配置文件之间来回切换;
- 查错困难,由于只是文本文件,所以很多报错只能在运行期间体现,IDE(集成开发环境)无法在编译期排查。
注解配置的优缺点
优点
- JDK自带反射方式解析,不会引入第三方库;
- 直接配置在Java源代码中,所以不会引入额外的配置文件,项目管理和维护变得简单了;
- 无论是定义、配置还是解析都是Java代码,所以不存在配置的时候需要在不同语法格式中切换的问题;
- IDE支持度高,排查错误方便,提高开发效率;
缺点
- 任何对配置、对定义的修改都需要改动Java代码,然后重新编译,重新打包应用;
- 不是通用标准,只能在Java中使用。
总结
这个世界没有什么是完美的,同样XML与注解也是这样,各有千秋。仔细通过以上对比,我们能发现XML与注解在配置这个应用场景中互补性是非常高的。XML的缺点就是注解的优点,反之亦然。所以这也是目前在JavaEE的各大框架中XML+Annotation配置流行的原因。把与代码关联度不高,并且改动的可能性大的配置写在XML文件中;专门配置Java代码级别关联度的,以后改动度小的则使用注解Annotation。
最后,本系列到此结束,希望对你有所帮助,感谢🙏🙏!
系列:
注解Annotation全解析(一):我不是注释
注解Annotation全解析(二):自定义注解的定义
注解Annotation全解析(三):自定义注解的配置使用
注解Annotation全解析(四):自定义注解的运行时解析
注解Annotation全解析(五):注解与XML的比较