[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kakie-tipy-advice-sushchestvuyut-v-spring-aop":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},618,"kakie-tipy-advice-sushchestvuyut-v-spring-aop",14,"spring","Spring","🌱","Какие типы Advice существуют в Spring AOP?","В Spring AOP существует пять типов advice, определяющих, когда выполняется дополнительная логика относительно целевого метода.\n\n| Тип | Когда выполняется |\n|-----|-------------------|\n| @Before | До вызова метода |\n| @AfterReturning | После успешного возврата метода |\n| @AfterThrowing | После выброса исключения |\n| @After | Всегда после метода (аналог finally) |\n| @Around | Оборачивает вызов целиком (самый мощный) |\n\n### Порядок выполнения\n\n`@Around (начало)` -> `@Before` -> метод -> `@AfterReturning` \u002F `@AfterThrowing` -> `@After` -> `@Around (конец)`\n\n\u003Cdetails>\n\u003Csummary>Примеры всех типов advice\u003C\u002Fsummary>\n\n```java\n@Before(\"execution(* com.example.service.*.*(..))\")\npublic void beforeAdvice(JoinPoint joinPoint) {\n    System.out.println(\"До вызова: \" + joinPoint.getSignature().getName());\n}\n\n@AfterReturning(pointcut = \"execution(* com.example.service.*.*(..))\", returning = \"result\")\npublic void afterReturningAdvice(JoinPoint joinPoint, Object result) {\n    System.out.println(\"Метод вернул: \" + result);\n}\n\n@AfterThrowing(pointcut = \"execution(* com.example.service.*.*(..))\", throwing = \"ex\")\npublic void afterThrowingAdvice(JoinPoint joinPoint, Exception ex) {\n    System.out.println(\"Исключение: \" + ex.getMessage());\n}\n\n@After(\"execution(* com.example.service.*.*(..))\")\npublic void afterAdvice(JoinPoint joinPoint) {\n    System.out.println(\"Метод завершён (в любом случае)\");\n}\n\n@Around(\"execution(* com.example.service.*.*(..))\")\npublic Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {\n    long start = System.currentTimeMillis();\n    try {\n        Object result = pjp.proceed(); \u002F\u002F вызов оригинального метода\n        return result;\n    } finally {\n        long elapsed = System.currentTimeMillis() - start;\n        System.out.println(pjp.getSignature().getName() + \" выполнен за \" + elapsed + \" мс\");\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Практический пример -- замер времени через собственную аннотацию\n\n```java\n@Target(ElementType.METHOD)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface Timed { }\n\n@Aspect\n@Component\npublic class TimingAspect {\n    @Around(\"@annotation(Timed)\")\n    public Object measureTime(ProceedingJoinPoint pjp) throws Throwable {\n        long start = System.nanoTime();\n        Object result = pjp.proceed();\n        long duration = (System.nanoTime() - start) \u002F 1_000_000;\n        log.info(\"{}.{} выполнен за {} мс\",\n                pjp.getTarget().getClass().getSimpleName(),\n                pjp.getSignature().getName(), duration);\n        return result;\n    }\n}\n```\n\n> **На собеседовании:** важно знать все 5 типов и порядок их выполнения. Частая ошибка в `@Around` -- забыть вызвать `pjp.proceed()` (метод не выполнится) или забыть вернуть результат `proceed()` (метод вернёт null).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":19,"featuredSnippetReady":22},"Какие типы Advice существуют в Spring AOP? — Gymterview","В Spring AOP существует пять типов advice, определяющих, когда выполняется дополнительная логика относительно целевого метода.","В Spring AOP существует пять типов advice, определяющих, когда выполняется дополнительная логика относительно целевого м",[7,13],true]