Ти можеш визначити біни контролера за допомогою стандартного визначення бінів 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).