Diferencia entre vs

1. Información general

En este tutorial, aprenderemos las diferencias entre dos elementos principales de configuración XML de Spring: y .

2. Definiciones de frijoles

Como todos sabemos, Spring nos proporciona dos formas de definir nuestros beans y dependencias: configuración XML y anotaciones Java. También podemos clasificar las anotaciones de Spring en dos grupos: anotaciones de inyección de dependencia y anotaciones de bean.

Antes de las anotaciones, tuvimos que definir manualmente todos nuestros beans y dependencias en archivos de configuración XML. Ahora, gracias a las anotaciones de Spring, puede descubrir y conectar automáticamente todos nuestros beans y dependencias por nosotros . Por lo tanto, podemos al menos eliminar el XML necesario para beans y dependencias.

Sin embargo, debemos recordar que las anotaciones son inútiles a menos que las activemos . Para activarlos, podemos agregar o encima de nuestro archivo XML.

En esta sección, veremos cómo y difieren entre sí en términos de sus formas de activar las anotaciones.

3. Activación de anotación por < context: annotation-config>

los La anotación se utiliza principalmente para activar las anotaciones de inyección de dependencia. @Autowired , @Qualifier , @PostConstruct , @PreDestroy y @Resource son algunos de los quepuede resolver.

Hagamos un ejemplo simple para ver cómo puede simplificarnos la configuración XML.

Primero, creemos una clase con un campo de dependencia:

public class UserService { @Autowired private AccountService accountService; }
public class AccountService {}

Ahora, definamos nuestros frijoles.

Antes de continuar, señalemos que todavía necesitamos declarar beans en XML. Eso es porqueactiva las anotaciones solo para los beans ya registrados en el contexto de la aplicación .

Como puede verse aquí, se anotaron el AccountService campo utilizando @Autowired . @Autowired le dice a Spring que este campo es una dependencia que necesita ser conectada automáticamente por un bean coincidente.

Si no usamos @Autowired , entonces tendríamos que configurar la dependencia accountService manualmente:

Ahora, podemos referirnos a nuestros beans y dependencias en una prueba unitaria:

@Test public void givenContextAnnotationConfig_whenDependenciesAnnotated_thenNoXMLNeeded() { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:annotationconfigvscomponentscan-beans.xml"); UserService userService = context.getBean(UserService.class); AccountService accountService = context.getBean(AccountService.class); Assert.assertNotNull(userService); Assert.assertNotNull(accountService); Assert.assertNotNull(userService.getAccountService()); }

Hmm, algo anda mal aquí. Parece que Spring no está transfiriendo el servicio de cuenta a pesar de que lo anotamos con @Autowired . Parece que @Autowired no está activo. Para resolver este problema, simplemente agregaremos la siguiente línea encima de nuestro archivo XML:

4. Activación de anotaciones por < context: component-scan>

Como similar a , también puede reconocer y procesar las anotaciones de inyección de dependencia. Además, reconoce las anotaciones de frijol que no detecta .

Básicamente, detecta las anotaciones mediante el escaneo de paquetes . Para decirlo de otra manera, le dice a Spring qué paquetes necesitan ser escaneados para buscar los beans o componentes anotados.

@Component , @Repository , @Service , @Controller , @RestController y @Configuration son varios quepuede detectar .

Ahora veamos cómo podemos simplificar nuestro ejemplo anterior:

@Component public class UserService { @Autowired private AccountService accountService; } 
@Component public class AccountService {}

Aquí, la anotación @Component marca nuestras clases como beans . Ahora, podemos limpiar todas las definiciones de bean de nuestro archivo XML. Y, por supuesto, debemos mantener el en lo alto de ello:

Finalmente, observemos que Spring buscará los beans anotados y las dependencias bajo el paquete indicado por el atributo base-package .

5. Conclusión

En este tutorial, analizamos las diferencias entre y .

Los ejemplos de código, como siempre, terminaron en GitHub.