Вы можете определить бины контроллера с помощью стандартного определения бинов Spring в WebApplicationContext сервлета. Стереотип @Controller позволяет производить автоматическое обнаружение, что соотносится с общей поддержкой Spring для обнаружения классов, помеченных аннотацией @Component, в classpath и автоматической регистрации определений бинов для них. Он также действует как стереотип для аннотированного класса, указывая на его роль как веб-компонента.

Чтобы активировать автоматическое обнаружение таких бинов с аннотацией @Controller, можно добавить сканирование компонентов в конфигурацию Java, как показано в следующем примере:

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

В следующем примере показан XML-эквивалент конфигурации из предыдущего примера:

<?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 – это составная аннотация, которая сама мета-аннотируется с помощью аннотаций @Controller и @ResponseBody для обозначения контроллера, каждый метод которого наследует аннотацию @ResponseBody на уровне типов и, следовательно, осуществляет запись непосредственно в тело ответа вместо распознавания представления и визуализации с помощью HTML-шаблона.

Прокси АОП

В некоторых случаях может понадобиться декорировать контроллер прокси АОП во время выполнения. Например, если вы решили пометить аннотациями @Transactional непосредственно контроллер. В таких случаях, в частности, для контроллеров, рекомендуем использовать проксирование на основе классов. Обычно это выбор по умолчанию для контроллеров. Однако если контроллер должен реализовать интерфейс, который не является обратным вызовом контекста Spring (например, InitializingBean, *Aware и другие), может понадобиться явным образом настроить проксирование на основе класса. Например, при <tx:annotation-driven/> можно изменить его на <tx:annotation-driven proxy-target-class="true"/>, а при @EnableTransactionManagement можно изменить его на @EnableTransactionManagement(proxyTargetClass = true).