Puede definir beans controladores utilizando la definición estándar de Spring Bean en el servlet WebApplicationContext. El estereotipo @Controller permite el descubrimiento automático, lo que se correlaciona con el soporte general de Spring para descubrir clases marcadas con la anotación @Component en el classpath y registrar automáticamente definiciones de beans para ellas. También actúa como un estereotipo para la clase anotada, indicando su función como componente web.

Para habilitar la detección automática de dichos beans con la anotación @Controller, puede agregar escaneo de componentes a su configuración de Java, como se muestra en el siguiente ejemplo:

Java
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
    // ...
}
Kotlin
@Configuration
@ComponentScan("org.example.web")
class WebConfig {
    // ...
}

El siguiente ejemplo muestra el equivalente XML de la configuración del ejemplo anterior:

<?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:p="http://www.springframework.org/schema/p"
    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:component-scan base-package="org.example.web"/>
    <!-- ... -->
</beans>

@RestController es una anotación compuesta que a su vez está metaanotada con las anotaciones @Controller y @ResponseBody para indicar el controlador, cada una método que hereda la anotación @ResponseBody a nivel de tipo y, por lo tanto, escribe directamente en el cuerpo de la respuesta en lugar de reconocer la vista y representarla usando una plantilla HTML.

Proxy AOP

En algunos casos, puede ser necesario decorar el controlador proxy AOP en tiempo de ejecución. Por ejemplo, si decide marcar el controlador con anotaciones @Transactional. En tales casos, particularmente para los controladores, recomendamos utilizar proxy basado en clases. Esta suele ser la opción predeterminada para los controladores. Sin embargo, si el controlador debe implementar una interfaz que no sea una devolución de llamada de contexto Spring (como InitializingBean, *Aware y otros), es posible que necesite configurar explícitamente la clase- proxy basado. Por ejemplo, con <tx:annotation-driven/> puedes cambiarlo a <tx:annotation-driven proxy-target-class="true"/> y con @EnableTransactionManagement puedes cambiarlo a @EnableTransactionManagement(proxyTargetClass = true).