注释配置相对于 xml 配置具有很多的优势:
它可以充分利用 java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 jpa 注释配置 orm 映射时,我们就不需要指定 po 的属性名、类型等信息,如果关系表字段和 po 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 java 反射机制获取。
注释和 java 代码位于一个文件中,而 xml 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 java 代码放在一起,有助于增强程序的内聚性。而采用独立的 xml 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。
因此在很多情况下,注释配置比 xml 配置更受欢迎,注释配置有进一步流行的趋势。spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 xml 配置的功能。
注释配置和 xml 配置的适用场合
是否有了这些 ioc 注释,我们就可以完全摒除原来 xml 配置的方式呢?答案是否定的。有以下几点原因:
注释配置不一定在先天上优于 xml 配置。如果 bean 的依赖关系是固定的,(如 service 使用了哪几个 dao 类),这种配置信息不会在部署时发生调整,那么注释配置优于 xml 配置;反之如果这种依赖关系会在部署时发生调整,xml 配置显然又优于注释配置,因为注释是对 java 源代码的调整,您需要重新改写源代码并重新编译才可以实施调整。
如果 bean 不是自己编写的类(如 jdbctemplate、sessionfactorybean 等),注释配置将无法实施,此时 xml 配置是唯一可用的方式。
注释配置往往是类级别的,而 xml 配置则可以表现得更加灵活。比如相比于 @transaction 事务注释,使用 aop/tx 命名空间的事务配置更加灵活和简单。
所以在实现应用中,我们往往需要同时使用注释配置和 xml 配置,对于类级别且不会发生变动的配置可以优先考虑注释配置;而对于那些第三方类以及容易发生调整的配置则应优先考虑使用 xml 配置。spring 会在具体实施 bean 创建和 bean 注入之前将这两种配置方式的元信息融合在一起。
小结
spring 在 2.1 以后对注释配置提供了强力的支持,注释配置功能成为 spring 2.5 的最大的亮点之一。合理地使用 spring 2.5 的注释配置,可以有效减少配置的工作量,提高程序的内聚性。但是这并不意味着传统 xml 配置将走向消亡,在第三方类 bean 的配置,以及那些诸如数据源、缓存池、持久层操作模板类、事务管理等内容的配置上,xml 配置依然拥有不可替代的地位。