← Назад к вопросам

Как Spring узнает о созданном контроллере

2.0 Middle🔥 281 комментариев
#Spring Boot и Spring Data#Spring Framework

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Как Spring узнает о созданном контроллере

Spring использует несколько механизмов для обнаружения контроллеров. Рассмотрим каждый из них подробно.

1. Аннотация @Controller/@RestController

Основной способ — использование аннотации @Controller или @RestController. Spring сканирует classpath в поиске классов с этими аннотациями:

@RestController
@RequestMapping("/api/users")
public class UserController {
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.findById(id);
    }
}

Следует отметить, что @RestController — это комбинация @Controller + @ResponseBody, которая автоматически сериализует ответ в JSON.

2. Component Scanning (Сканирование компонентов)

Spring находит контроллеры через механизм Component Scanning. Процесс работает так:

  1. Инициализация ApplicationContext — при запуске Spring контейнер создаёт контекст приложения
  2. Определение базовых пакетов — Spring знает, из какого пакета начинать сканирование (обычно из пакета, содержащего @SpringBootApplication)
  3. Сканирование classpath — Spring сканирует все классы в базовых пакетах и их подпакетах
  4. Проверка аннотаций — для каждого класса проверяются аннотации, которые Spring должен обработать
  5. Создание bean-ов — контроллеры регистрируются в контексте как bean-ы

3. Явная конфигурация (@ComponentScan)

Если нужно сканировать пакеты вне стандартного расположения:

@SpringBootApplication
@ComponentScan(basePackages = {"com.example.controllers", "com.example.services"})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. Java-конфигурация

Можно явно зарегистрировать контроллер через @Bean:

@Configuration
public class ControllerConfig {
    @Bean
    public UserController userController(UserService userService) {
        return new UserController(userService);
    }
}

5. XML-конфигурация (ленаси)

В старых версиях Spring использовалась XML-конфигурация:

<context:component-scan base-package="com.example.controllers"/>

Механизм работы Component Scanning

Под капотом процесс выглядит так:

  1. ClassPathScanningCandidateComponentProvider — сканирует classpath на предмет кандидатов
  2. AnnotationTypeFilter — ищет классы с необходимыми аннотациями
  3. MetadataReader — читает метаинформацию о классе без загрузки его в память
  4. BeanDefinitionRegistry — регистрирует найденные классы как BeanDefinition

Когда Spring считает класс контроллером

Spring воспринимает класс как контроллер, если:

  • На классе присутствует аннотация @Controller или @RestController
  • Класс находится в области сканирования (в basePakcages)
  • Класс имеет публичный конструктор (или может быть внедрена зависимость)

Порядок обработки

  1. ClassPathScanningCandidateComponentProvider находит класс
  2. Проверяется наличие @Controller/@RestController
  3. Создаётся BeanDefinition
  4. Spring создаёт экземпляр bean-а
  5. Внедряются зависимости (@Autowired)
  6. Bean становится доступным в контексте
  7. Регистрируются URL mapping-и для методов с @RequestMapping, @GetMapping и т.д.

Этот процесс полностью автоматический и прозрачный для разработчика, что делает Spring таким удобным фреймворком для разработки веб-приложений.

Как Spring узнает о созданном контроллере | PrepBro