Вы можете определить бины контроллера с помощью стандартного определения бинов Spring в WebApplicationContext
сервлета. Стереотип @Controller
позволяет производить автоматическое обнаружение, что соотносится с общей поддержкой Spring для обнаружения классов, помеченных аннотацией @Component
, в classpath и автоматической регистрации определений бинов для них. Он также действует как стереотип для аннотированного класса, указывая на его роль как веб-компонента.
Чтобы активировать автоматическое обнаружение таких бинов с аннотацией @Controller
, можно добавить сканирование компонентов в конфигурацию Java, как показано в следующем примере:
@Configuration
@ComponentScan("org.example.web")
public class WebConfig {
// ...
}
@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)
.