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:
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
// ...
}
@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)
.