Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 412новых вакансий за сутки·55 411вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 671
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 728
  • Облачные технологии6 606
  • QA вакансии2 165
  • Android1 317
  • Инженер данных878
  • Продакт-менеджер314

Разработка

  • iOS1 229
  • Backend вакансии1 210
  • AI вакансии545
  • Fullstack вакансии500
  • Frontend вакансии422
  • Mobile вакансии28

По стеку

  • Go5 192
  • Java3 112
  • Kotlin1 085
  • Node.js992
  • Rust846
  • .NET660
  • PHP319
  • C++266
  • C#208

DevOps и инфраструктура

  • Kubernetes3 904
  • Linux-инфраструктура2 843
  • DevOps вакансии2 684
  • Terraform / IaC2 162
  • Мониторинг и Observability1 062
  • CI/CD921
  • SRE303
  • Кибербезопасность31

Аналитика и данные

  • Аналитик данных537
  • Data Scientist445
  • Бизнес-аналитик402
  • Системный аналитик68

Другие направления

  • Проджект-менеджер103
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise186 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Spring FrameworkВсе вопросы
Spring FrameworkMiddleТеория

В чём разница между @Before, @After, @Around, @AfterReturning и @AfterThrowing advice?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

@Before — до вызова; @After — после (всегда); @AfterReturning — при успешном возврате; @AfterThrowing — при исключении; @Around — полный контроль: вызывает proceed(), может менять аргументы и результат.

Рабочий пример

@Aspect
@Component
public class AuditAspect {

    // 1. @Before — логируем входящий аргумент
    @Before("execution(* com.example.OrderService.place(..))")
    public void logBefore(JoinPoint jp) {
        System.out.println("[BEFORE] args: " + Arrays.toString(jp.getArgs()));
    }

    // 2. @AfterReturning — читаем результат без изменения
    @AfterReturning(
        pointcut = "execution(* com.example.OrderService.place(..))",
        returning  = "result"
    )
    public void logResult(Object result) {
        System.out.println("[AFTER_RETURNING] orderId=" + result);
    }

    // 3. @AfterThrowing — фиксируем ошибку в мониторинге
    @AfterThrowing(
        pointcut  = "execution(* com.example.OrderService.*(..))",
        throwing  = "ex"
    )
    public void logError(Exception ex) {
        Metrics.counter("order.error", "type", ex.getClass().getSimpleName()).increment();
    }

    // 4. @After (finally) — всегда освобождаем ресурс
    @After("execution(* com.example.OrderService.place(..))")
    public void releaseContext() {
        RequestContext.clear();
    }

    // 5. @Around — замер времени + возможность изменить результат
    @Around("@annotation(com.example.Timed)")
    public Object measureTime(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        try {
            return pjp.proceed(); // обязателен!
        } finally {
            long elapsed = System.currentTimeMillis() - start;
            System.out.println("[AROUND] " + pjp.getSignature() + " took " + elapsed + "ms");
        }
    }
}

Порядок выполнения при нормальном вызове: @Around(before proceed) → @Before → метод → @Around(after proceed) → @AfterReturning → @After. При исключении: @Around(before proceed) → @Before → метод (exception) → @AfterThrowing → @After.

Типы advice и их контракт

Spring AOP реализует пять типов advice, каждый из которых привязан к конкретной точке жизненного цикла вызова метода.

  • @Before — выполняется до вызова целевого метода. Не может предотвратить вызов (кроме выброса исключения). Подходит для проверки прав, логирования входящих параметров.
  • @After (finally-advice) — выполняется после метода независимо от исхода (успех или исключение). Аналог блока finally.
  • @AfterReturning — выполняется только при нормальном завершении. Через атрибут returning получает возвращаемое значение, но не может его изменить.
  • @AfterThrowing — выполняется только если метод выбросил исключение. Через атрибут throwing получает объект исключения. Не подавляет его.
  • @Around — самый мощный: оборачивает вызов целиком. Обязан вызвать ProceedingJoinPoint.proceed(), иначе целевой метод не выполнится. Может изменить аргументы, перехватить возвращаемое значение, подавить исключение или вернуть другой результат.

Подводные камни

  • Забытый proceed() в @Around — целевой метод молча не вызывается; баг почти невозможно обнаружить по логам.
  • Self-invocation обходит прокси — если метод класса вызывает другой метод того же класса напрямую (this.foo()), advice не сработает, потому что вызов идёт мимо Spring-прокси.
  • @AfterReturning не может изменить возвращаемое значение — для этого нужен @Around; попытка присвоить переменной returning новый объект ни на что не влияет.
  • @AfterThrowing не подавляет исключение — если нужно проглотить ошибку и вернуть fallback, используйте @Around с try/catch вокруг proceed().
  • Порядок нескольких аспектов — без явного @Order порядок advice от разных аспектов на одном методе не детерминирован; для транзакций и безопасности порядок критичен.
  • @After vs @AfterReturning при исключении — @After выполняется всегда (как finally), @AfterReturning — только при успехе; путаница приводит к дублированию кода очистки.
  • Proxy-based ограничение — по умолчанию Spring AOP работает через JDK dynamic proxy (для интерфейсов) или CGLIB (для классов); аспекты не перехватывают private и final методы.
  • Checked exceptions в @Around — сигнатура proceed() бросает Throwable; нельзя просто поймать Exception, нужно либо пробрасывать Throwable, либо явно обрабатывать оба типа.

Типичные ошибки

  • Путать термин «aop advice types» с соседним механизмом Spring Framework.
  • Не называть границу lifecycle, transaction, thread или request для «aop advice types».
  • Игнорировать production-эффекты «aop advice types»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «aop advice types» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «aop advice types».
  • Уточнить, какие настройки или API меняют «aop advice types» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Spring Framework →

Источники

  • https://docs.spring.io/spring-framework/reference/core/aop.html

Связанные темы

Spring Frameworkbackend-designtechnical-communication

Частые вопросы на собеседовании

  • Что такое Spring Framework и какие проблемы он решает?
  • Что такое Spring Bean? Как IoC-контейнер Spring управляет бинами?
  • Что такое Spring MVC? Объясните жизненный цикл запроса в DispatcherServlet.
  • Что такое Inversion of Control (IoC) и как Spring его реализует?