Основные аннотации Spring

Регистрация и конфигурация

АннотацияНазначение
@Configurationкласс конфигурации
@Beanfactory-метод bean
@Componentкомпонент для scanning
@Serviceкомпонент сервисного слоя
@Repositorypersistence-компонент и перевод исключений
@ControllerMVC-контроллер с представлением
@RestControllercontroller + тело ответа
@ComponentScanгде искать компоненты
@Importявно подключить конфигурацию/компонент

Внедрение и выбор

  • @Autowired — разрешить зависимость;
  • @Qualifier — выбрать кандидата;
  • @Primary — кандидат по умолчанию;
  • @Value — внедрить отдельное значение;
  • @ConfigurationProperties — связать группу настроек с типом.

Для обязательной зависимости предпочтителен конструктор. Для набора настроек — типизированный properties-класс вместо множества строковых @Value.

Условия и жизненный цикл

  • @Profile и @Conditional... — условная регистрация;
  • @Lazy — отложенное создание или proxy;
  • @Scope — область жизни;
  • @PostConstruct / @PreDestroy — callbacks;
  • @Order — порядок поддерживаемых цепочек/коллекций.

Инфраструктурное поведение

  • @Transactional — транзакционный interceptor;
  • @Async — выполнение через executor;
  • @Cacheable, @CachePut, @CacheEvict — кэш;
  • @Scheduled — запуск по расписанию;
  • @EventListener — обработчик события.

Большинство таких аннотаций действует через Spring Proxy. Поэтому важны внешняя точка вызова, видимость метода и факт, что объект создан контейнером.

Web MVC

  • @RequestMapping, @GetMapping, @PostMapping и другие;
  • @PathVariable, @RequestParam, @RequestHeader;
  • @RequestBody, @ResponseBody;
  • @ControllerAdvice, @ExceptionHandler;
  • @Valid для запуска Bean Validation.

Вопросы для повторения

  1. Чем @Bean отличается от @Component? Первый регистрируется factory-методом, второй находится scanning.
  2. @RestController что объединяет? @Controller и @ResponseBody.
  3. Почему @Transactional может не сработать? Вызов обошёл proxy либо объект создан вручную.
  4. Когда @ConfigurationProperties лучше @Value? Для связанной группы типизированных настроек.
  5. @Order задаёт порядок создания бинов? Обычно нет; он упорядочивает коллекции и поддерживаемые цепочки.

Связано: Бин отличие от Component, Способы внедрения зависимостей Spring, Контроллеры Spring.