В чем разница между аннотациями @Controller и @Component в Spring? Можно ли их заменять?

«В чем разница между аннотациями @Controller и @Component в Spring? Можно ли их заменять?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

@Controller — это стереотипная аннотация, наследующая @Component. Технически замена возможна, но семантически — это ухудшение дизайна.

Ключевые различия:

Аспект @Controller @Component
Семантика Четко обозначает компонент веб-слоя (MVC). Общая аннотация для любого Spring bean.
Обработка Обнаруживается <mvc:annotation-driven/> или @EnableWebMvc как кандидат для маппинга запросов. Только регистрируется как bean в контексте.
Специфика Может использоваться в паре с @ResponseBody для REST (@RestController). Не несет специфичной для MVC функциональности.

Пример и последствия замены:

// Явно и правильно: это веб-контроллер
@Controller
public class UserController {
    @GetMapping("/users")
    public String listUsers(Model model) { ... }
}

// Технически работает, но стилистически плохо: скрывает назначение класса
@Component // Избегайте такой замены для контроллеров
public class UserController {
    @GetMapping("/users") // Маппинг все равно сработает
    public String listUsers(Model model) { ... }
}

Вывод: Не заменяйте @Controller на @Component. Использование специализированных стереотипов (@Controller, @Service, @Repository) улучшает читаемость кода, помогает в инструментарии (AOP, мониторинг) и следует общепринятым best practices Spring.