¿Son las anotaciones mejores que XML para configurar Spring?

La introducción de la configuración basada en anotaciones ha planteado la cuestión de si este enfoque es "mejor" que el enfoque XML. Respuesta corta: "Depende de la situación". La respuesta larga es que cada enfoque tiene sus pros y sus contras y, por regla general, corresponde al desarrollador decidir qué estrategia le conviene mejor. Debido a la forma en que se definen, las anotaciones proporcionan mucho contexto en su declaración, lo que permite una configuración más breve y concisa. Sin embargo, XML hace un gran trabajo al vincular componentes sin afectar su código fuente y sin tener que recompilarlos. Algunos desarrolladores prefieren mantener la herramienta de enlace cerca del código fuente, mientras que otros argumentan que las clases anotadas ya no son POJO y que la configuración se vuelve descentralizada y más difícil de controlar.

Independientemente de la elección, Spring puede proporcionar ambos estilos e incluso mezclarlos. Vale la pena señalar que, gracias a la opción JavaConfig, Spring le permite usar anotaciones de forma no invasiva sin afectar el código fuente de los componentes de destino y que, desde la perspectiva de las herramientas, todos los estilos de configuración son compatibles Herramientas de primavera para Eclipse.

Una alternativa a la configuración XML es la configuración basada en anotaciones, que se basa en metadatos de código de bytes para conectar componentes en lugar de declaraciones entre corchetes angulares. En lugar de utilizar XML para describir la herramienta de enlace del bean, el desarrollador envuelve la configuración en la propia clase del bean utilizando anotaciones para la declaración de clase, método o campo correspondiente. Como se menciona en la subsección Ejemplo: AutowiredAnnotationBeanPostProcessor, usandoBeanPostProcessor en combinación con anotaciones es un medio común para ampliar el contenedor Spring IoC. Por ejemplo, Spring 2.0 introdujo la capacidad de forzar propiedades requeridas usando la anotación @Required. Spring 2.5 permitió el mismo enfoque general para gestionar la inyección de dependencias utilizando Spring. Esencialmente, la anotación @Autowired proporciona las mismas capacidades que se describen en la sección" Detección y vinculando objetos que interactúan, pero con un control más preciso y una aplicabilidad más amplia. Spring 2.5 también agregó soporte para anotaciones JSR-250 como @PostConstruct y @PreDestroy. Para Spring 3.0, se agregó soporte para las anotaciones JSR-330 (Inyección de dependencia para Java) contenidas en el paquete javax.inject, como @Inject y @Named.

La inyección de dependencia mediante anotaciones se produce antes de la inyección de dependencia mediante XML. Por lo tanto, la configuración XML anula las anotaciones de propiedades mediante ambos enfoques.

Como de costumbre, puede registrar postprocesadores como definiciones de beans independientes, pero también se pueden registrar implícitamente incluyendo la siguiente etiqueta en su configuración Spring XML (tenga en cuenta la inclusión del espacio de nombres context):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
</beans>

El elemento <context:annotation-config/> registra implícitamente los siguientes postprocesadores:

<context:annotation-config/> solo busca anotaciones para beans en el mismo contexto de aplicación en el que está definido. Esto significa que si pones <context:annotation-config/> en WebApplicationContext para DispatcherServlet, comprobará la presencia de beans @Autowired solo en sus controladores, no en servicios.