注解本质上通过反射来实现的,我们都知道,反射是一种程序的自省机制,其实反射是破坏封装的一种方式,反射的效率很低的,对程序本身访问会造成很多的额外开销。比如你采用Spring注解,@resource标识在一个类上面,那么程序会通过反射一遍遍的调用,首先通过class得到类对象,然后调取其中的getAnnotations()方法遍历类上的注解,一遍扫描和寻找注解,这其中就会有减慢效率,这不过是一种语法糖。其实通过xml来配置更好,不过不够方便,注解的最终意义也就是方便程序员而已。

 Annotation和xml各自作为配置项的优点与缺点。 
 一、Annotation 的优点 
  1、保存在 class 文件中,降低维护成本。 
  2、无需工具支持,无需解析。 
  3、编译期即可验证正确性,查错变得容易。 
  4、提升开发效率。 
 Annotation 缺点: 
  1、若要对配置项进行修改,不得不修改 Java 文件,重新编译打包应用。 
  2、配置项编码在 Java 文件中,可扩展性差。    
 二、XML 
  目前web应用中几乎都使用xml作为配置项,例如我们常用的框架Struts、Spring、Hibernate、IBatis等等都采用xml作为配置。 
  xml之所以这么流行,是因为它的很多优点是其它技术的配置所无法替代的。 
  1、xml作为可扩展标记语言最大的优势在于开发者能够为软件量身定制适用的标记,使代码更加通俗易懂。 
  2、利用xml配置能使软件更具扩展性。例如Spring将class间的依赖配置在xml中,最大限度地提升应用的可扩展性。 
  3、具有成熟的验证机制确保程序正确性。利用Schema或DTD可以对xml的正确性进行验证,避免了非法的配置导致应用程序出错。 
  4、修改配置而无需变动现有程序。

  虽然有如此多的好处,但毕竟没有什么万能的东西,xml也有自身的缺点。 
  1、需要解析工具或类库的支持。 
  2、解析xml势必会影响应用程序性能,占用系统资源。 
  3、配置文件过多导致管理变得困难。 
  4、编译期无法对其配置项的正确性进行验证,或要查错只能在运行期。 
  5、IDE无法验证配置项的正确性无能为力。 
  6、查错变得困难。往往配置的一个手误导致莫名其妙的错误。 
  7、开发人员不得不同时维护代码和配置文件,开发效率变得低下。 
  8、配置项与代码间存在潜规则。改变了任何一方都有可能影响另外一方。