{"id":485010,"date":"2026-06-25T12:23:31","date_gmt":"2026-06-25T12:23:31","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=485010"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=485010","title":{"rendered":"\u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f Spring Proxy: \u043a\u0442\u043e \u0438 \u0437\u0430\u0447\u0435\u043c \u043f\u043e\u0434\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0430\u0448\u0438 \u0431\u0438\u043d\u044b"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0431\u0435\u0437\u0440\u0430\u0431\u043e\u0442\u043d\u044b\u0439 Java &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0449\u0435\u0442 \u0441\u0435\u0431\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u044f&#8230;))<\/em><\/p>\n<p><em>\u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0440\u0435\u0431\u044f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u0442\u043e\u0440\u044e <\/em><span class=\"habrahidden\"><em>(\u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u0432\u0441\u0435\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d, \u0446\u0435\u043d\u044e)<\/em><\/span><em>, \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0434 &#171;\u0438&#187; \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0435 &#8212; \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 Proxy \u0432 Spring, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187;.<\/em><\/p>\n<hr\/>\n<h3>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0438\u0445 proxy, \u0441\u043e\u0437\u0434\u0430\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0435\u0437\u0434\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>SpringProxyInspector<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">import org.springframework.aop.Advisor;import org.springframework.aop.framework.Advised;import org.springframework.aop.support.AopUtils;import org.springframework.core.Ordered;public class SpringProxyInspector {    public static void inspect(Object bean, String beanName) {        System.out.println(\"\\n=======================================================\");        System.out.println(\"\u041f\u0420\u041e\u0412\u0415\u0420\u041a\u0410 \u041f\u0420\u041e\u041a\u0421\u0418: \" + beanName);        System.out.println(\"=======================================================\");        System.out.println(\"\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441: \" + bean.getClass().getName());            if (!(bean instanceof Advised advised)) {            System.out.println(\" \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0435 Spring AOP \u043f\u0440\u043e\u043a\u0441\u0438.\");            System.out.println(\"=======================================================\\n\");            return;        }        String proxyType = AopUtils.isCglibProxy(bean) ? \"CGLIB (\u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435)\"                          : AopUtils.isJdkDynamicProxy(bean) ? \"JDK Dynamic Proxy (\u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441)\"                          : \"\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u043a\u0441\u0438\";                System.out.println(\" \u251c\u2500\u2500 \u0422\u0438\u043f \u043f\u0440\u043e\u043a\u0441\u0438: \" + proxyType);        System.out.println(\" \u251c\u2500\u2500 \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 (Target): \" + advised.getTargetSource().getTargetClass().getName());        Advisor[] advisors = advised.getAdvisors();        System.out.println(\" \u2514\u2500\u2500 \u041d\u0430\u0439\u0434\u0435\u043d\u043e Advisor'\u043e\u0432: \" + advisors.length);        for (int i = 0; i &lt; advisors.length; i++) {            Advisor advisor = advisors[i];                        String orderInfo = \"\u041d\u0435 \u0437\u0430\u0434\u0430\u043d\";            if (advisor instanceof Ordered ordered) {                int order = ordered.getOrder();                orderInfo = (order == Ordered.HIGHEST_PRECEDENCE) ? \"HIGHEST_PRECEDENCE\"                           : (order == Ordered.LOWEST_PRECEDENCE) ? \"LOWEST_PRECEDENCE\"                           : String.valueOf(order);            }            System.out.printf(\"     [%d] %s%n\", i + 1, advisor.getClass().getSimpleName());            System.out.printf(\"         \u251c\u2500\u2500 Order: %s%n\", orderInfo);            if (advisor.getAdvice() != null) {                System.out.printf(\"         \u2514\u2500\u2500 Advice: %s%n\", advisor.getAdvice().getClass().getName());            } else {                System.out.println(\"         \u2514\u2500\u2500 Advice: \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\");            }        }        System.out.println(\"=======================================================\\n\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u0432\u0435\u0441\u0443 &#8212; \u043a\u0430\u043a \u0436\u0435 \u0442\u0430\u043c \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e?<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. <\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:  <\/p>\n<pre><code class=\"java\">public interface OrderService {    void processOrder();    void outerMethod();}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u0442\u0440\u0435\u043c\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"java\">@Servicepublic class OrderServiceImpl implements OrderService {    @Cacheable(\"orders\")    @Transactional    @LogExecutionTime    public void processOrder() {        System.out.println(\"    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!\");    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><code>@Cacheable(\"orders\")<\/code>\u00a0\u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0435\u0448\u0430 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p><code>@Transactional<\/code>\u00a0\u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\/\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<\/li>\n<li>\n<p><code>@LogExecutionTime<\/code>\u00a0\u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 AspectJ-\u0430\u0441\u043f\u0435\u043a\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0440\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c Spring-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0447\u0442\u043e\u00a0<code>@Cacheable<\/code>\u00a0\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442,\u00a0<code>@Transactional<\/code>\u00a0\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439\u00a0<code>@LogExecutionTime<\/code>\u00a0\u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. <\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"java\">@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface LogExecutionTime {}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u0430\u0441\u043f\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0451 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442:  <\/p>\n<pre><code class=\"java\">@Aspect@Componentpublic class LogExecutionTimeAspect {    @Around(\"@annotation(LogExecutionTime)\")    public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {        System.out.println(\"    [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...\");        Object result = joinPoint.proceed();        System.out.println(\"    [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\");        return result;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437\u00a0<code>@EnableCaching<\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 main \u043a\u043b\u0430\u0441\u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u00a0<code>CommandLineRunner<\/code> \u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c:  <\/p>\n<pre><code class=\"java\">@SpringBootApplication@EnableCachingpublic class SpringProxyApplication {    public static void main(String[] args) {        SpringApplication.run(SpringProxyDemoApplication.class, args);    }    @Bean    public CommandLineRunner runInspector(OrderService orderService) {        return args -&gt; {          System.out.println(orderService.getClass());          orderService.processOrder();    };}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u042f \u0432\u044b\u0437\u044b\u0432\u0430\u044e OrderService. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0439 \u043a\u043b\u0430\u0441\u0441?<\/h3>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438: <\/p>\n<pre><code class=\"java\">class oleborn.spring.OrderServiceImpl$$SpringCGLIB$$0    [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!    [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043d\u043e\u0439 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u0430. \u0412\u0435\u0434\u044c \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c\u00a0<code>class OrderServiceImpl<\/code>, \u0430 \u0432\u0438\u0434\u0438\u043c \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u00a0<code>$$SpringCGLIB$$<\/code>. \u0418 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441. <\/p>\n<p>\u0415\u0441\u043b\u0438 Spring \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u0433\u0434\u0435-\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 <code>OrderServiceImpl<\/code>. \u041d\u043e \u043a\u0442\u043e \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b? \u0413\u0434\u0435 \u043e\u043d \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f? \u0418 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442? <\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f&#8230;<\/p>\n<p><strong><em>\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:<\/em><\/strong><em>\u00a0\u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0443\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430, Spring \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u044b \u043d\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439\u00a0<\/em><code><em>OrderServiceImpl<\/em><\/code><em>, \u0438\u00a0<\/em><code><em>getClass()<\/em><\/code><em>\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0431\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0432\u044b \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b\u00a0<\/em><code><em>@Transactional<\/em><\/code><em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e.<\/em><\/p>\n<h3>\u041a\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b \u043c\u043e\u0439 \u0431\u0438\u043d?<\/h3>\n<p>\u0416\u0438\u0437\u043d\u044c \u043d\u0430\u0448\u0435\u0433\u043e\u00a0<code>OrderServiceImpl<\/code>\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e. Spring \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u00a0<code>BeanDefinition<\/code>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043a\u044d\u0448\u0435\u0439, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041d\u043e \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0438 \u0442\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0438\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0<code>ApplicationContext<\/code>, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440 \u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043f\u043e \u0448\u0430\u0433\u0430\u043c. <\/p>\n<p>\u0412 Spring \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0435 \u0444\u0430\u0437\u044b:\u00a0<strong>\u0444\u0430\u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/strong>\u00a0(\u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f) \u0438\u00a0<strong>\u0444\u0430\u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/strong>\u00a0(\u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434). \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e.<\/p>\n<h4>\u0428\u0430\u0433 1. \u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0438\u043d\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0<code>postProcessAfterInitialization()<\/code>\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u00a0<code>AbstractAutoProxyCreator<\/code>. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445\u00a0<code>BeanPostProcessor<\/code>&#8216;\u043e\u0432, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u044e\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043d\u0430\u0448 \u0441\u0432\u0435\u0436\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">BeanDefinition \u2192 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 OrderServiceImpl (\u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442)                    \u2193    \u0432\u0441\u0435 BeanPostProcessor'\u044b \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442                    \u2193    AbstractAutoProxyCreator.postProcessAfterInitialization()                    \u2193    wrapIfNecessary() \u2014 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438?                    \u2193    \u0435\u0441\u043b\u0438 \u0434\u0430 \u2192 \u0441\u0431\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 getAdvicesAndAdvisorsForBean() Advisor'\u043e\u0432                    \u2193    \u0447\u0435\u043e\u0435\u0437 createProxy() \u0438 ProxyFactory \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438                    \u2193    \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2192 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u00a0<code>OrderServiceImpl<\/code>\u00a0\u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u043d\u043e \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u043e\u0431\u0451\u0440\u0442\u043e\u043a.\u00a0<code>AbstractAutoProxyCreator<\/code>\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u00a0<code>Advisor<\/code>&#8216;\u044b? \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0431\u0438\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u043e\u043b wrapIfNecessary(). \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c.<\/p>\n<p>\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 Spring-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u044d\u0442\u043e\u00a0<code>AnnotationAwareAspectJAutoProxyCreator<\/code>. \u041a\u043b\u0430\u0441\u0441 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0438 Advisor&#8217;\u044b \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0431\u0438\u043d\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c.<\/p>\n<h4>\u0428\u0430\u0433 2. \u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f Advisor&#8217;\u044b?<\/h4>\n<p>\u041e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440 \u043d\u0430 \u0448\u0430\u0433 \u0432\u043f\u0435\u0440\u0435\u0434, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u00a0<code>getAdvicesAndAdvisorsForBean()<\/code>. \u0417\u0434\u0435\u0441\u044c Spring \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 Advisor&#8217;\u044b, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0438\u043d\u0430.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441:\u00a0<\/p>\n<p><strong>\u0410 \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0437\u044f\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<\/strong><code><strong>BeanFactoryTransactionAttributeSourceAdvisor<\/strong><\/code><strong>? \u0412\u0435\u0434\u044c \u044f \u0432\u0440\u043e\u0434\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u00a0<\/strong><code><strong>new BeanFactoryTransactionAttributeSourceAdvisor()<\/strong><\/code><strong>?<\/strong><\/p>\n<p>\u041e\u043d\u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435, \u0432\u0441\u0451 \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0432\u043e\u0438 \u043c\u0435\u0441\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438\u00a0<code>@EnableCaching<\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0431\u0438\u043d\u00a0<code>BeanFactoryCacheOperationSourceAdvisor<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u00a0<code>@Transactional<\/code>\u00a0\u0438 Spring \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u00a0<code>BeanFactoryTransactionAttributeSourceAdvisor<\/code>\u00a0(\u0447\u0435\u0440\u0435\u0437\u00a0<code>@EnableTransactionManagement<\/code>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0435\u0451 \u044f\u0432\u043d\u043e, Spring Boot \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438\u00a0<code>spring-tx<\/code>\u00a0\u043d\u0430 classpath).<\/p>\n<\/li>\n<li>\n<p>\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 \u0441\u00a0<code>@Aspect<\/code>\u00a0\u0438\u00a0<code>@Around(\"@annotation(LogExecutionTime)\")<\/code>\u00a0\u0438 Spring \u0441\u043e\u0437\u0434\u0430\u043b\u00a0<code>InstantiationModelAwarePointcutAdvisorImpl<\/code>\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0433\u043e\u043b\u044b\u0439\u00a0<code>OrderServiceImpl<\/code>\u00a0\u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0<code>getAdvicesAndAdvisorsForBean()<\/code>, Spring \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0441\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0445 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e Advisor&#8217;\u0430. <\/p>\n<p>\u0421\u043e\u0432\u043f\u0430\u043b\u043e? \u041a\u043b\u0430\u0434\u0451\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.<\/p>\n<p>\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0435\u0442\u043e\u0434\u00a0<code>processOrder()<\/code>\u00a0\u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0442\u0440\u0435\u043c\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"java\">@Cacheable(\"orders\")@Transactional@LogExecutionTimepublic void processOrder() { ... }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0442\u0440\u0438 Advisor&#8217;\u0430: \u0434\u043b\u044f \u043a\u0435\u0448\u0430, \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430. \u041f\u043b\u044e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439\u00a0<code>ExposeInvocationInterceptor<\/code>\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. <\/p>\n<p><strong>\u0412\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f:<\/strong><\/p>\n<p>\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0443\u043c\u0430\u043b\u0438 \u0447\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00a0<code>@Transactional<\/code>,\u00a0<code>@Cacheable<\/code>,\u00a0<code>@LogExecutionTime<\/code> \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u044f\u0432\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a Spring \u0441\u043e\u0431\u0440\u0430\u043b Advisor&#8217;\u044b, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0445\u043e\u0434\u044f\u0442 \u0441\u043e \u0441\u0446\u0435\u043d\u044b. \u0412 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 Java-\u043e\u0431\u044a\u0435\u043a\u0442\u044b:\u00a0<code>TransactionInterceptor<\/code>,\u00a0<code>CacheInterceptor<\/code>\u00a0\u0438 \u0432\u0430\u0448\u00a0<code>LogExecutionTimeAspect<\/code>\u00a0(\u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u0432\u00a0<code>AspectJAroundAdvice<\/code>).<\/p>\n<p>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 bootstrap. \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Advisor&#8217;\u043e\u0432 \u043e\u043d\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c: \u0435\u0441\u043b\u0438 \u0432\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 (\u0447\u0442\u043e \u0432\u0440\u044f\u0434 \u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u043a\u0441\u0438.<\/p>\n<h4>\u0428\u0430\u0433 3. \u0416\u0435\u0441\u0442\u043a\u0430\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u043d:\u00a0<strong>\u0432 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f?<\/strong>\u00a0\u0412\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u043a\u044d\u0448 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0411\u0414, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f, \u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u00a0<code>sortAdvisors()<\/code>. \u0417\u0434\u0435\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00a0<code>AnnotationAwareOrderComparator<\/code>. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0430\u0433\u043c\u0430\u0442\u0438\u0447\u0435\u043d \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0432 \u0441\u0442\u0440\u043e\u0433\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ol>\n<li>\n<p><code><strong>PriorityOrdered<\/strong><\/code>\u00a0\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0432\u044b\u0441\u0448\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442. \u0417\u0434\u0435\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439\u00a0<code>ExposeInvocationInterceptor<\/code>\u00a0\u0433\u043e\u0440\u0434\u043e \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u0431\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 0.<\/p>\n<\/li>\n<li>\n<p><code><strong>Ordered<\/strong><\/code>\u00a0\u0438\u043c\u0435\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442. \u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u0438 (\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043a\u044d\u0448) \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u00a0<code>LOWEST_PRECEDENCE<\/code>\u00a0\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0435\u0446.<\/p>\n<\/li>\n<li>\n<p><code><strong>@Order<\/strong><\/code> \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u043d\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430\u0448\u00a0<code>SpringProxyInspector<\/code> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043e\u043d \u0432\u0435\u0440\u043d\u0435\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c:<\/p>\n<pre><code class=\"java\">=======================================================\u041f\u0420\u041e\u0412\u0415\u0420\u041a\u0410 \u041f\u0420\u041e\u041a\u0421\u0418: OrderService=======================================================\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441: oleborn.spring.OrderServiceImpl$$SpringCGLIB$$0 \u251c\u2500\u2500 \u0422\u0438\u043f \u043f\u0440\u043e\u043a\u0441\u0438: CGLIB (\u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435) \u251c\u2500\u2500 \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 (Target): oleborn.taskswithspring.Issue.OrderServiceImpl \u2514\u2500\u2500 \u041d\u0430\u0439\u0434\u0435\u043d\u043e Advisor'\u043e\u0432: 4     [1] ExposeInvocationInterceptor         \u251c\u2500\u2500 Order: HIGHEST_PRECEDENCE         \u2514\u2500\u2500 Advice: org.springframework.aop.interceptor.ExposeInvocationInterceptor     [2] BeanFactoryCacheOperationSourceAdvisor         \u251c\u2500\u2500 Order: LOWEST_PRECEDENCE         \u2514\u2500\u2500 Advice: org.springframework.cache.interceptor.CacheInterceptor     [3] BeanFactoryTransactionAttributeSourceAdvisor         \u251c\u2500\u2500 Order: LOWEST_PRECEDENCE         \u2514\u2500\u2500 Advice: org.springframework.transaction.interceptor.TransactionInterceptor     [4] InstantiationModelAwarePointcutAdvisorImpl         \u251c\u2500\u2500 Order: LOWEST_PRECEDENCE         \u2514\u2500\u2500 Advice: org.springframework.aop.aspectj.AspectJAroundAdvice=======================================================<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u043f\u0435\u0440\u0432\u044b\u0439 Advisor \u0438\u043c\u0435\u0435\u0442\u00a0<code>Order: HIGHEST_PRECEDENCE<\/code>\u00a0(\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u00a0<code>-2147483647<\/code>). \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014\u00a0<code>LOWEST_PRECEDENCE<\/code>\u00a0(<code>2147483647<\/code>). \u041c\u0430\u0440\u0448\u0440\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0440\u0435\u0448\u0435\u043d. \u041c\u0430\u0441\u0441\u0438\u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d \u0433\u043e\u0442\u043e\u0432 \u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0432\u00a0<code>ProxyFactory<\/code>.  <\/p>\n<h4>\u0428\u0430\u0433 4. \u0424\u0430\u0431\u0440\u0438\u043a\u0430 \u0438 \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u043a\u0430<\/h4>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432. \u041a\u0442\u043e \u0438\u0445 \u0441\u043a\u043b\u0435\u0438\u0442?<\/p>\n<p>\u0412 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442\u00a0<code>ProxyFactory<\/code>. \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>createProxy()<\/code>. \u0417\u0430\u0433\u043b\u044f\u043d\u0435\u043c \u0432 \u043a\u043e\u0434 (\u0432\u0437\u044f\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439, \u043e\u0441\u043c\u0435\u043b\u0438\u043b\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u043e\u0438\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432):<\/p>\n<details class=\"spoiler\">\n<summary>createProxy()<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">protected Object createProxy(Class&lt;?&gt; beanClass, @Nullable String beanName,@Nullable Object[] specificInterceptors, TargetSource targetSource) {return buildProxy(beanClass, beanName, specificInterceptors, targetSource, false);}private Class&lt;?&gt; createProxyClass(Class&lt;?&gt; beanClass, @Nullable String beanName,@Nullable Object[] specificInterceptors, TargetSource targetSource) {return (Class&lt;?&gt;) buildProxy(beanClass, beanName, specificInterceptors, targetSource, true);}private Object buildProxy(Class&lt;?&gt; beanClass, @Nullable String beanName,@Nullable Object[] specificInterceptors, TargetSource targetSource, boolean classOnly) {if (this.beanFactory instanceof ConfigurableListableBeanFactory clbf) {AutoProxyUtils.exposeTargetClass(clbf, beanName, beanClass);}ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.copyFrom(this);if (proxyFactory.isProxyTargetClass()) {\/\/ Explicit handling of JDK proxy targets and lambdas (for introduction advice scenarios)if (Proxy.isProxyClass(beanClass) || ClassUtils.isLambdaClass(beanClass)) {\/\/ Must allow for introductions; can't just set interfaces to the proxy's interfaces only.for (Class&lt;?&gt; ifc : beanClass.getInterfaces()) {proxyFactory.addInterface(ifc);}}}else {\/\/ No proxyTargetClass flag enforced, let's apply our default checks...if (shouldProxyTargetClass(beanClass, beanName)) {proxyFactory.setProxyTargetClass(true);}else {evaluateProxyInterfaces(beanClass, proxyFactory);}}        \/\/\u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443\u0442 \u0432 buildAdvisors() \u0438\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 advisorsAdvisor[] advisors = buildAdvisors(beanName, specificInterceptors);        \/\/\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 Advisor'\u043e\u0432proxyFactory.addAdvisors(advisors);              \/\/\u041f\u0440\u044f\u0447\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043dproxyFactory.setTargetSource(targetSource);customizeProxyFactory(proxyFactory);        \/\/\u0417\u0430\u043c\u043e\u0440\u043e\u0437\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e private boolean freezeProxy = false;proxyFactory.setFrozen(this.freezeProxy);if (advisorsPreFiltered()) {proxyFactory.setPreFiltered(true);}\/\/ Use original ClassLoader if bean class not locally loaded in overriding class loaderClassLoader classLoader = getProxyClassLoader();if (classLoader instanceof SmartClassLoader smartClassLoader &amp;&amp; classLoader != beanClass.getClassLoader()) {classLoader = smartClassLoader.getOriginalClassLoader();}return (classOnly ? proxyFactory.getProxyClass(classLoader) : proxyFactory.getProxy(classLoader));}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 \u2014 \u0432\u044b\u0437\u043e\u0432\u00a0<code>proxyFactory.getProxy()<\/code>. CGLIB \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e\u00a0<code>OrderServiceImpl$$SpringCGLIB$$0<\/code>.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430? \u041b\u0435\u0436\u0438\u0442 \u043b\u0438 \u043e\u043d \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u043e\u043b\u044f\u0445?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043a\u043e\u043f\u043d\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438\u00a0<code>ObjenesisCglibAopProxy<\/code>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e, \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443:<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0442\u043e\u0434\u00a0<code>setFrozen(true)<\/code>\u00a0\u0447\u0430\u0441\u0442\u043e \u0443\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u0438\u0437 \u0432\u0438\u0434\u0430. \u0417\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u041d\u0435 \u0431\u0443\u0434\u0435\u043c \u0433\u0430\u0434\u0430\u0442\u044c, \u043e\u0442\u043a\u0440\u043e\u0435\u043c JavaDoc \u0441\u0430\u043c\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Spring:<\/p>\n<blockquote>\n<p><em>&#171;Set whether the config is frozen. When config is frozen, no advice changes can be made.&#187;<\/em><\/p>\n<\/blockquote>\n<p>\u0422\u0443\u0442 Spring \u043c\u043e\u0436\u0435\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e \u0437\u0430\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043e\u043d \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u0442, \u0432\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u043a\u0441\u0438 \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443\u00a0<code>Advised<\/code>\u00a0\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043d\u043e\u0432\u044b\u0439 Advisor. \u041c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u043a\u0441\u0438 \u0435\u0433\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0410 \u043a\u0442\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438? \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 Spring \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u043a\u0441\u0438 \u0447\u0435\u0440\u0435\u0437 CGLIB. <\/p>\n<h4>\u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 CGLIB?<\/h4>\n<p>\u0412\u0435\u0434\u044c Java \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u043d\u044f <code>java.lang.reflect.Proxy<\/code>.<\/p>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 Spring \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0431\u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Spring (\u0434\u043e Boot 2.x) \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f JDK Dynamic Proxy. \u041d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0432 \u0447\u0451\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0430.<\/p>\n<p><strong>JDK Dynamic Proxy<\/strong> \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c\u0438. \u041e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u043a\u0441\u0438-\u043e\u0431\u044a\u0435\u043a\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0442\u0435 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0447\u0442\u043e \u0438 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441. \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u00a0<code>InvocationHandler.invoke()<\/code>, \u0433\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u044e (<code>Method.invoke()<\/code>) \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p><strong>CGLIB (Code Generation Library) <\/strong>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043d\u0430\u0447\u0435. \u0412\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u00a0<strong>\u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441<\/strong>\u00a0\u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437\u00a0<code>MethodInterceptor.intercept()<\/code>. \u041d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u2014 \u0432\u043d\u0443\u0442\u0440\u0438 CGLIB \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u00a0<strong>FastClass<\/strong>\u00a0\u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0441\u0438\u0438. FastClass \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0447\u0435\u0440\u0435\u0437 reflection. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0430\u0445.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0434\u0430, \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: CGLIB \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u043a\u0441\u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c JDK-\u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u041d\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 Spring \u0431\u0438\u043d\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u044d\u0442\u043e \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e. \u0410 \u0432\u043e\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0432\u0430\u0436\u043d\u0435\u0435.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Spring Boot \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 CGLIB<\/h3>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e Spring Boot 2.x,\u00a0<strong>\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CGLIB<\/strong>. \u042d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u0447\u0438\u043d.<\/p>\n<p><strong>\u041f\u0435\u0440\u0432\u0430\u044f \u0438 \u0433\u043b\u0430\u0432\u043d\u0430\u044f &#8212; \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/strong>\u00a0JDK Dynamic Proxy \u0442\u0440\u0435\u0431\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0430\u0441\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0443\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. CGLIB \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><strong>\u0412\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432.<\/strong>\u00a0\u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441, \u0441\u0442\u0430\u0432\u0438\u0442\u0435\u00a0<code>@Service<\/code>, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435\u00a0<code>@Transactional<\/code> \u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.<\/p>\n<p><strong>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/strong>\u00a0CGLIB \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f FastClass.<\/p>\n<h4>\u0428\u0430\u0433 5. \u0410\u043d\u0430\u0442\u043e\u043c\u0438\u044f CGLIB-\u043f\u0440\u043e\u043a\u0441\u0438<\/h4>\n<p>\u0418, \u043d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 &#8212; \u0432\u044b\u0437\u043e\u0432\u00a0<code>proxyFactory.getProxy()<\/code>. <\/p>\n<p>CGLIB \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0441\u0430\u043c\u043e\u0433\u043e\u00a0<code>OrderServiceImpl$$SpringCGLIB$$0<\/code>.<\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430? \u041b\u0435\u0436\u0438\u0442 \u043b\u0438 \u043e\u043d \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u043e\u043b\u044f\u0445?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u043a\u043e\u043f\u043d\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438\u00a0<code>ObjenesisCglibAopProxy<\/code>, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e, \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443(\u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Proxy Spring):<\/p>\n<pre><code class=\"java\">\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 (OrderServiceImpl$$SpringCGLIB$$0)    \u2502    \u251c\u2500\u2500 Callback[] (\u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043b\u043b\u0431\u0435\u043a\u043e\u0432)    \u2502       \u2502    \u2502       \u2514\u2500\u2500 [0] DynamicAdvisedInterceptor (\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a)    \u2502               \u2502    \u2502               \u2514\u2500\u2500 AdvisedSupport    \u2502                       \u251c\u2500\u2500 Advisor[] (\u043d\u0430\u0448 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432)    \u2502                       \u2514\u2500\u2500 TargetSource (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d)    \u2502    \u2514\u2500\u2500 \u043c\u0435\u0442\u043e\u0434\u044b-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 (\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0441\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b)            \u2502            \u2514\u2500\u2500 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 DynamicAdvisedInterceptor.intercept()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u043c\u0430\u0441\u0441\u0438\u0432\u00a0<code>Advisor[]<\/code>\u00a0\u043d\u0435 \u043b\u0435\u0436\u0438\u0442 \u043f\u0440\u044f\u043c\u043e \u0432 \u043f\u043e\u043b\u044f\u0445 \u043f\u0440\u043e\u043a\u0441\u0438. \u041e\u043d \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>AdvisedSupport<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432\u00a0<code>DynamicAdvisedInterceptor<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0448\u00a0<code>SpringProxyInspector<\/code>\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u00a0<code>Advised<\/code>, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b.<\/p>\n<p>\u0418 \u0432\u043e\u0442, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0435\u043c, \u0433\u0434\u0435 \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432. \u041d\u043e \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u043d\u044f\u043b\u0441\u044f, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435.<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437 \u0441\u043e\u0441\u0435\u0434\u043d\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043a\u0442\u043e-\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u00a0<code>orderService.processOrder()<\/code>?<\/p>\n<p> \u041a\u0442\u043e \u043d\u0430\u0447\u043d\u0451\u0442 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0442\u0440\u0451\u0448\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043d\u0430\u0448 \u043c\u0430\u0441\u0441\u0438\u0432?<\/p>\n<h3>ReflectiveMethodInvocation &#8212; \u0432\u043e\u0442 \u043a\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u0435\u0441\u044c \u0434\u0432\u0438\u0436<\/h3>\n<p>\u0413\u0434\u0435-\u0442\u043e \u0432 \u043a\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432:<\/p>\n<pre><code class=\"java\">orderService.processOrder();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e\u00a0<code>orderService<\/code>\u00a0\u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u00a0<code>OrderServiceImpl<\/code>, \u0430 CGLIB-\u043f\u0440\u043e\u043a\u0441\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c\u00a0<code>OrderServiceImpl$$SpringCGLIB$$0<\/code>. \u0427\u0442\u043e \u0436\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0433\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430?<\/p>\n<h4>\u0428\u0430\u0433 1. \u0412\u0445\u043e\u0434 \u0432 \u043f\u0440\u043e\u043a\u0441\u0438<\/h4>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430 CGLIB-\u043f\u0440\u043e\u043a\u0441\u0438, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b CGLIB. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u043e\u043a\u0441\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e):  <\/p>\n<pre><code class=\"java\">public void processOrder() {    \/\/\u0432\u043d\u0443\u0442\u0440\u0438 CGLIB \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 Callback[]    \/\/\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 intercept() \u0443 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (DynamicAdvisedInterceptor)    MethodInterceptor interceptor = ... \/\/DynamicAdvisedInterceptor    interceptor.intercept(this, method, args, methodProxy);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u0440\u0442\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u0434\u0430\u00a0<code>proxyFactory.getProxy()<\/code>\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434. \u041e\u043d \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u0432 \u0432\u0430\u0448\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0432\u00a0<code><strong>DynamicAdvisedInterceptor.intercept()<\/strong><\/code>.<\/p>\n<h4>\u0428\u0430\u0433 2. DynamicAdvisedInterceptor \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440<\/h4>\n<p><code>DynamicAdvisedInterceptor<\/code>\u00a0\u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0<code>MethodInterceptor<\/code>\u00a0(\u0438\u0437 CGLIB), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0443\u0437\u043b\u043e\u043c. \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043b\u0435\u0436\u0438\u0442\u00a0<code>AdvisedSupport<\/code>\u00a0\u0441 \u043d\u0430\u0448\u0438\u043c \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d.<\/p>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0<code>intercept()<\/code>\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u00a0<code>ReflectiveMethodInvocation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430 \u0432\u0445\u043e\u0434 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430\u00a0<code>interceptorsAndDynamicMethodMatchers<\/code>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<code>invocation.proceed()<\/code>.<\/p>\n<p>\u042d\u0442\u043e\u00a0<strong>\u0441\u0435\u0440\u0434\u0446\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/strong>. \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u043e\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0430\u0448\u0438 Advisor&#8217;\u044b.<\/p>\n<h4>\u0428\u0430\u0433 3. \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 ReflectiveMethodInvocation.proceed()<\/h4>\n<p><code>ReflectiveMethodInvocation<\/code> \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0432 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>proceed()<\/code>. <\/p>\n<p>\u041e\u043d \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a \u043a\u0430\u043a \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 <strong>Chain of Responsibility<\/strong>. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0435\u0433\u043e\u00a0<code>invoke()<\/code>\u00a0\u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430\u00a0<code>proceed()<\/code>.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430: \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u041e\u043d\u0430 \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<strong>\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438<\/strong>\u00a0\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0437\u043e\u0432\u0430.<\/p>\n<h4>\u0428\u0430\u0433 4. \u0420\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a<\/h4>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0412 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0432\u0438\u0434\u0438\u043c: <\/p>\n<pre><code class=\"java\">--- \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 (\u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043a\u0441\u0438) ---    [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!    [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0432 \u0445\u0440\u043e\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u043c \u043f\u043e \u0448\u0430\u0433\u0430\u043c. <\/p>\n<h4>\u0428\u0430\u0433 5. \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/h4>\n<p>\u041f\u043e\u043c\u043d\u0438\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u0430 \u0432 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ol>\n<li>\n<p><code>ExposeInvocationInterceptor<\/code>\u00a0(HIGHEST_PRECEDENCE)<\/p>\n<\/li>\n<li>\n<p><code>CacheInterceptor<\/code>\u00a0(LOWEST_PRECEDENCE)<\/p>\n<\/li>\n<li>\n<p><code>TransactionInterceptor<\/code>\u00a0(LOWEST_PRECEDENCE)<\/p>\n<\/li>\n<li>\n<p><code>AspectJAroundAdvice<\/code>\u00a0(LOWEST_PRECEDENCE)<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f\u00a0<code>proceed()<\/code>. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0441\u0442\u0435\u043a\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">ReflectiveMethodInvocation.proceed()    \u2502    \u251c\u2500\u2500 currentInterceptorIndex = 0 \u2192 \u0431\u0435\u0440\u0451\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a [0]    \u2502   \u2514\u2500\u2500 ExposeInvocationInterceptor.invoke()    \u2502       \u2502    \u2502       \u251c\u2500\u2500 \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u043e (\u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432 \u0432 ThreadLocal)    \u2502       \u251c\u2500\u2500 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 invocation.proceed()  \u2190 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432!    \u2502       \u2502    \u2502       \u2502   ReflectiveMethodInvocation.proceed()    \u2502       \u2502   \u2502    \u2502       \u2502   \u251c\u2500\u2500 currentInterceptorIndex = 1 \u2192 \u0431\u0435\u0440\u0451\u0442 [1]    \u2502       \u2502   \u2502   \u2514\u2500\u2500 CacheInterceptor.invoke()    \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u044d\u0448 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430    \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 invocation.proceed()    \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   ReflectiveMethodInvocation.proceed()    \u2502       \u2502   \u2502       \u2502   \u2502    \u2502       \u2502   \u2502       \u2502   \u251c\u2500\u2500 currentInterceptorIndex = 2 \u2192 \u0431\u0435\u0440\u0451\u0442 [2]    \u2502       \u2502   \u2502       \u2502   \u2502   \u2514\u2500\u2500 TransactionInterceptor.invoke()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e    \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 invocation.proceed()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   ReflectiveMethodInvocation.proceed()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u251c\u2500\u2500 currentInterceptorIndex = 3 \u2192 \u0431\u0435\u0440\u0451\u0442 [3]    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502   \u2514\u2500\u2500 AspectJAroundAdvice.invoke()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 invocation.proceed()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   ReflectiveMethodInvocation.proceed()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2514\u2500\u2500 currentInterceptorIndex = 4 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439)    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502       \u2514\u2500\u2500 invokeJoinpoint()    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502           \u2514\u2500\u2500 [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430...    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502       \u2514\u2500\u2500 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502   \u2514\u2500\u2500 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f TransactionInterceptor    \u2502       \u2502   \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u043a\u043e\u043c\u043c\u0438\u0442\/rollback \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438    \u2502       \u2502   \u2502       \u2502   \u2502       \u2514\u2500\u2500 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442    \u2502       \u2502   \u2502       \u2502   \u2502    \u2502       \u2502   \u2502       \u2502   \u2514\u2500\u2500 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f CacheInterceptor    \u2502       \u2502   \u2502       \u2502    \u2502       \u2502   \u2502       \u251c\u2500\u2500 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u043a\u044d\u0448    \u2502       \u2502   \u2502       \u2514\u2500\u2500 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442    \u2502       \u2502   \u2502    \u2502       \u2502   \u2514\u2500\u2500 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f ExposeInvocationInterceptor    \u2502       \u2502    \u2502       \u2514\u2500\u2500 \u043e\u0447\u0438\u0449\u0430\u0435\u0442 ThreadLocal    \u2502    \u2514\u2500\u2500 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<h4>\u0428\u0430\u0433 6. \u0412\u0430\u0436\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b<\/h4>\n<p>\u0412\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e\u00a0<strong>\u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u0433\u043e \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438<\/strong>.\u00a0<code>ExposeInvocationInterceptor<\/code>\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0435\u0440\u0432\u044b\u0439, \u043d\u043e \u043e\u043d \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443, \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439\u00a0<code>MethodInvocation<\/code>\u00a0\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0447\u0435\u0440\u0435\u0437\u00a0<code>ThreadLocal<\/code>\u00a0\u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p><code>CacheInterceptor<\/code>\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u044d\u0448\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0432\u044b\u0437\u043e\u0432\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0435\u0441\u0442\u044c \u0432 \u043a\u044d\u0448\u0435, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c\u00a0<code>proceed()<\/code> \u0438 \u0442\u043e\u0433\u0434\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043d\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f, \u0438 \u0430\u0441\u043f\u0435\u043a\u0442 \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><code>TransactionInterceptor<\/code>\u00a0\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 (\u043a\u043e\u043c\u043c\u0438\u0442\/rollback) \u043f\u043e\u0441\u043b\u0435.<\/p>\n<p><code>AspectJAroundAdvice<\/code>\u00a0\u044d\u0442\u043e \u043d\u0430\u0448 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f\u00a0<strong>\u0434\u043e<\/strong>\u00a0\u0438\u00a0<strong>\u043f\u043e\u0441\u043b\u0435<\/strong>\u00a0\u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0434 \u0446\u0435\u043b\u0435\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0447\u0435\u0440\u0435\u0437\u00a0<code>@Order<\/code>, \u043e\u043d \u043c\u043e\u0433 \u0431\u044b \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u044c\u0448\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u043a\u044d\u0448\u0430.<\/p>\n<p><strong>\u0418\u0442\u043e\u0433:\u00a0<\/strong><code><strong>proceed()<\/strong><\/code><strong>\u00a0\u044d\u0442\u043e \u0434\u0432\u0438\u0436\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430\u00a0<\/strong><code><strong>proceed()<\/strong><\/code><strong>, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043c\u0435\u0442\u043e\u0434, \u043d\u043e \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u0438.<\/strong><\/p>\n<p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u00a0<strong>Chain of Responsibility<\/strong>, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00a0<strong>\u0434\u043e<\/strong>\u00a0<code>proceed()<\/code><\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0448\u0438\u0442\u044c\u00a0<strong>\u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c<\/strong>\u00a0<code>proceed()<\/code>\u00a0(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 \u043a\u044d\u0448\u0430)<\/p>\n<\/li>\n<li>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00a0<strong>\u043f\u043e\u0441\u043b\u0435<\/strong>\u00a0<code>proceed()<\/code><\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 self-invocation \u043b\u043e\u043c\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438?<\/h3>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c\u00a0<code>ReflectiveMethodInvocation<\/code>, \u043c\u044b \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043c \u0441\u0430\u043c\u0443\u044e \u0447\u0430\u0441\u0442\u0443\u044e \u0431\u043e\u043b\u044c Spring-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u044c \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u0441 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0435\u0439, \u043a\u043e\u0433\u0434\u0430\u00a0<code>@Transactional<\/code>\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e \u044d\u0442\u043e \u043e\u043d\u043e.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043d\u0430\u0448\u00a0<code>OrderServiceImpl<\/code>. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u00a0<code>outerMethod()<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u00a0<code>processOrder()<\/code>\u00a0\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"java\">@Servicepublic class OrderServiceImpl implements OrderService {    @Cacheable(\"orders\")    @Transactional    @LogExecutionTime    public void processOrder() {        System.out.println(\"    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!\");    }    public void outerMethod() {        System.out.println(\"    [Target] \u0412\u044b\u0437\u0432\u0430\u043d outerMethod(). \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0437\u043e\u0432\u0443 processOrder() \u0447\u0435\u0440\u0435\u0437 this...\");        processOrder();   \/\/\u0432\u044b\u0437\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 this    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u00a0<code>outerMethod()<\/code>\u00a0\u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0432\u044b\u0432\u043e\u0434: <\/p>\n<pre><code class=\"java\">--- \u0412\u044b\u0437\u043e\u0432 \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 Self-Invocation ---[Target] \u0412\u044b\u0437\u0432\u0430\u043d outerMethod(). \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0437\u043e\u0432\u0443 processOrder() \u0447\u0435\u0440\u0435\u0437 this...[Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:\u00a0<strong>\u043d\u0435\u0442<\/strong>\u00a0\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0442 \u0430\u0441\u043f\u0435\u043a\u0442\u0430. \u041d\u0435\u0442\u00a0<code>[Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...<\/code>, \u043d\u0435\u0442\u00a0<code>[Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/code>\u00a0\u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0441\u043b\u0435\u0434\u043e\u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438\u043b\u0438 \u043a\u044d\u0448\u0430.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>\u0412\u0441\u043f\u043e\u043c\u043d\u0438\u043c, \u043a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u043a\u0441\u0438:<\/p>\n<pre><code class=\"java\">\u041f\u0440\u043e\u043a\u0441\u0438 (OrderServiceImpl$$SpringCGLIB$$0)    \u2502    \u2514\u2500\u2500 DynamicAdvisedInterceptor            \u2514\u2500\u2500 AdvisedSupport                    \u251c\u2500\u2500 Advisor[] (\u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432)                    \u2514\u2500\u2500 TargetSource \u2192 OrderServiceImpl (\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0435\u00a0<code>orderService.outerMethod()<\/code>\u00a0\u0438\u0437\u0432\u043d\u0435, \u0432\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043a\u00a0<strong>\u043f\u0440\u043e\u043a\u0441\u0438<\/strong>. \u041f\u0440\u043e\u043a\u0441\u0438 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u044b\u0437\u043e\u0432, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u00a0<code>DynamicAdvisedInterceptor<\/code>, \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f\u00a0<code>ReflectiveMethodInvocation<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0441\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432.<\/p>\n<p>\u041d\u043e \u0432\u043d\u0443\u0442\u0440\u0438\u00a0<code>outerMethod()<\/code>\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u00a0<code>this.processOrder()<\/code>.\u00a0<code>this<\/code> \u044d\u0442\u043e \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0<strong>\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442<\/strong>\u00a0<code>OrderServiceImpl<\/code>, \u0430 \u043d\u0435 \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438. \u0412\u044b\u0437\u043e\u0432 \u0438\u0434\u0451\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u0446\u0435\u043b\u0435\u0432\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u043c\u0438\u043d\u0443\u044f\u00a0<code>Callback[]<\/code>,\u00a0<code>DynamicAdvisedInterceptor<\/code>,\u00a0<code>AdvisedSupport<\/code>\u00a0\u0438 \u0432\u0441\u0435 Advisor&#8217;\u044b.<\/p>\n<p>\u0426\u0435\u043f\u043e\u0447\u043a\u0430 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443\u00a0<code>@Transactional<\/code>,\u00a0<code>@Cacheable<\/code>,\u00a0<code>@LogExecutionTime<\/code>\u00a0\u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00a0<strong>\u043d\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u0430\u0445<\/strong>.<\/p>\n<p>\u042d\u0442\u043e \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 Spring AOP, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u043f\u0440\u043e\u043a\u0441\u0438. \u041f\u0440\u043e\u043a\u0441\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 \u0432\u043d\u0435\u0434\u0440\u0451\u043d\u043d\u044b\u0439 \u0431\u0438\u043d. \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0447\u0435\u0440\u0435\u0437\u00a0<code>this<\/code>\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0434\u0443\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443.<\/p>\n<h3>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? (\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0430\u0437\u043b)<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0441\u0451 \u0432 \u0435\u0434\u0438\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u0440\u0442\u0438\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<h4>\u0424\u0430\u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f)<\/h4>\n<pre><code class=\"java\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 BeanDefinition \u2192 OrderServiceImpl (\u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442)                  \u2502\u2502                    \u2193                                               \u2502\u2502 AbstractAutoProxyCreator.postProcessAfterInitialization()         \u2502\u2502                    \u2193                                               \u2502\u2502 getAdvicesAndAdvisorsForBean()                                    \u2502\u2502     \u2193                                                             \u2502\u2502     \u0421\u0431\u043e\u0440 Advisor'\u043e\u0432:                                              \u2502\u2502     - @EnableCaching \u2192 BeanFactoryCacheOperationSourceAdvisor    \u2502\u2502       \u2192 CacheInterceptor                                          \u2502\u2502     - @Transactional \u2192 BeanFactoryTransactionAttributeSourceAdvisor\u2502\u2502       \u2192 TransactionInterceptor                                    \u2502\u2502     - @Aspect \u2192 InstantiationModelAwarePointcutAdvisorImpl        \u2502\u2502       \u2192 AspectJAroundAdvice                                       \u2502\u2502     - \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u2192 ExposeInvocationInterceptor (\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u0434\u0430)\u2502\u2502                    \u2193                                               \u2502\u2502 sortAdvisors() (AnnotationAwareOrderComparator)                   \u2502\u2502    \u2192 ExposeInvocationInterceptor (HIGHEST_PRECEDENCE)            \u2502\u2502    \u2192 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 (LOWEST_PRECEDENCE)                               \u2502\u2502                    \u2193                                               \u2502\u2502 ProxyFactory                                                      \u2502\u2502     \u2193                                                             \u2502\u2502 setTargetSource(new SingletonTargetSource(bean))                 \u2502\u2502 addAdvisors(advisors)                                             \u2502\u2502 setFrozen(true) \u2014 \u0437\u0430\u043c\u043e\u0440\u043e\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438                         \u2502\u2502     \u2193                                                             \u2502\u2502 getProxy() \u2192 OrderServiceImpl$$SpringCGLIB$$0                    \u2502\u2502                    \u2193                                               \u2502\u2502 \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438:                                   \u2502\u2502     Callback[] (\u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043b\u043b\u0431\u0435\u043a\u043e\u0432)                                 \u2502\u2502         \u2192 [0] DynamicAdvisedInterceptor                           \u2502\u2502             \u2192 AdvisedSupport                                      \u2502\u2502                 \u2192 Advisor[] (\u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439, \u0437\u0430\u043c\u043e\u0440\u043e\u0436\u0435\u043d\u043d\u044b\u0439)      \u2502\u2502                 \u2192 TargetSource (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d)      \u2502\u2502     \u041c\u0435\u0442\u043e\u0434\u044b-\u043e\u0431\u0451\u0440\u0442\u043a\u0438 (\u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0432\u0441\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b)          \u2502\u2502         \u2192 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 DynamicAdvisedInterceptor.intercept()  \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0424\u0430\u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f (\u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430)<\/h4>\n<pre><code class=\"java\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502 orderService.processOrder()                                      \u2502\u2502                    \u2193                                               \u2502\u2502 CGLIB-\u043f\u0440\u043e\u043a\u0441\u0438 (OrderServiceImpl$$SpringCGLIB$$0)                   \u2502\u2502     \u2192 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 processOrder()                        \u2502\u2502                    \u2193                                               \u2502\u2502 DynamicAdvisedInterceptor.intercept()                            \u2502\u2502     \u2192 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 ReflectiveMethodInvocation                         \u2502\u2502     \u2192 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u0441\u043f\u0438\u0441\u043e\u043a interceptors (Advisor'\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b)      \u2502\u2502                    \u2193                                               \u2502\u2502 ReflectiveMethodInvocation.proceed() (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e)                \u2502\u2502     \u2193                                                             \u2502\u2502     Interceptor1: ExposeInvocationInterceptor                     \u2502\u2502         \u2192 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u044b\u0437\u043e\u0432 \u0432 ThreadLocal                           \u2502\u2502         \u2192 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 proceed()                                      \u2502\u2502     \u2193                                                             \u2502\u2502     Interceptor2: CacheInterceptor                                \u2502\u2502         \u2192 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u044d\u0448 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430                                 \u2502\u2502         \u2192 \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432 \u043a\u044d\u0448\u0435 \u2014 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 proceed()                   \u2502\u2502         \u2192 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430                        \u2502\u2502     \u2193                                                             \u2502\u2502     Interceptor3: TransactionInterceptor                          \u2502\u2502         \u2192 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430                          \u2502\u2502         \u2192 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 proceed()                                      \u2502\u2502         \u2192 \u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442 \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430                    \u2502\u2502     \u2193                                                             \u2502\u2502     Interceptor4: AspectJAroundAdvice (\u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442)          \u2502\u2502         \u2192 [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438...                        \u2502\u2502         \u2192 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 proceed()                                      \u2502\u2502         \u2192 [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.                          \u2502\u2502     \u2193                                                             \u2502\u2502     invokeJoinpoint() \u2192 OrderServiceImpl.processOrder()          \u2502\u2502         \u2192 [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430!           \u2502\u2502                    \u2191                                               \u2502\u2502     (\u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0435: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0447\u0438\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442   \u2502\u2502      \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0438 after-\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f)                 \u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0432\u0441\u0442\u0430\u043b \u043d\u0430 \u0441\u0432\u043e\u0451 \u043c\u0435\u0441\u0442\u043e. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0433\u0434\u0435 \u0440\u043e\u0436\u0434\u0430\u044e\u0442\u0441\u044f Advisor&#8217;\u044b, \u043a\u0430\u043a \u043e\u043d\u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043a\u0430\u043a \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u043a\u0430\u043a \u043e\u0436\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<h3>\u041f\u043e\u0441\u043b\u0435\u0441\u043b\u043e\u0432\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430)<\/h3>\n<p>\u042f \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u0431\u043e\u0440\u0430, Spring AOP \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u0412\u0430\u0441 \u043c\u0430\u0433\u0438\u0435\u0439. <\/p>\n<p>\u0415\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u00a0<code>@Transactional<\/code>\u00a0\u043a\u0430\u043a \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u0418\u043b\u0438 <code>@Async<\/code> \u0438\u043b\u0438 \u0432 <code>@Cacheble<\/code> . \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0435\u00a0<code>MethodInterceptor'\u044b<\/code>\u00a0\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c\u00a0<code>proceed()<\/code>.<\/p>\n<p>\u0412\u0435\u0434\u044c \u044d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c. \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0447\u0451\u0440\u043d\u043e\u0439 \u043c\u0430\u0433\u0438\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442-\u043a\u043e\u0434, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 CGLIB, \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u043e\u0434\u0443\u043c\u0430\u043d\u043d\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430 Chain of Responsibility.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u0443\u0432\u0438\u0434\u0438\u0442\u0435\u00a0<code>$$SpringCGLIB$$<\/code>\u00a0\u0432 \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441\u0435 \u0438\u043b\u0438 \u043b\u043e\u0433\u0435, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0442\u043e\u0447\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u043e\u0448\u0438\u0431\u043a\u0430, \u0430 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c Spring, \u0434\u0435\u043b\u0430\u044e\u0449\u0430\u044f \u0432\u0430\u0448\u0443 \u0436\u0438\u0437\u043d\u044c \u043f\u0440\u043e\u0449\u0435.<\/p>\n<hr\/>\n<p>\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0430\u0432\u0442\u043e\u0440\u043e\u043c\u00a0<a href=\"https:\/\/t.me\/Java_for_beginner_dev\" rel=\"noopener noreferrer nofollow\">telegram-\u043a\u0430\u043d\u0430\u043b\u0430<\/a>\u00a0\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 Java.<\/p>\n<hr\/>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0430\u0432\u0442\u043e\u0440\u0430\u043c):<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/532000\/#sobes\" rel=\"noopener noreferrer nofollow\">@Transactional \u0432 Spring \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/597797\/\" rel=\"noopener noreferrer nofollow\">Spring AOP: \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/javarush.com\/quests\/lectures\/questspring.level01.lecture64\" rel=\"noopener noreferrer nofollow\">\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/articles\/750894\/\" rel=\"noopener noreferrer nofollow\">\u041c\u0430\u0433\u0438\u044f Spring Framework \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/a><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1051878\/\">https:\/\/habr.com\/ru\/articles\/1051878\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0442\u043e\u043c \u043a\u0430\u043a \u0431\u0435\u0437\u0440\u0430\u0431\u043e\u0442\u043d\u044b\u0439 Java &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0449\u0435\u0442 \u0441\u0435\u0431\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u044f&#8230;))\u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437, \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0440\u0435\u0431\u044f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u043d\u043e \u043c\u0435\u043d\u0442\u043e\u0440\u044e (\u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u0443\u044f\u0441\u044c \u0441\u043b\u0443\u0447\u0430\u0435\u043c, \u0432\u0441\u0435\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d, \u0446\u0435\u043d\u044e), \u044f \u0440\u0435\u0448\u0438\u043b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0438 \u043d\u0430\u0434 &#171;\u0438&#187; \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0435 &#8212; \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 Proxy \u0432 Spring, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e &#171;\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c&#187;.\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0438\u0445 proxy, \u0441\u043e\u0437\u0434\u0430\u043c \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u0432\u0435\u0437\u0434\u0435:SpringProxyInspectorimport org.springframework.aop.Advisor;import org.springframework.aop.framework.Advised;import org.springframework.aop.support.AopUtils;import org.springframework.core.Ordered;public class SpringProxyInspector {    public static void inspect(Object bean, String beanName) {        System.out.println(&#171;\\n=======================================================&#187;);        System.out.println(&#171;\u041f\u0420\u041e\u0412\u0415\u0420\u041a\u0410 \u041f\u0420\u041e\u041a\u0421\u0418: &#187; + beanName);        System.out.println(&#171;=======================================================&#187;);        System.out.println(&#171;\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441: &#187; + bean.getClass().getName());            if (!(bean instanceof Advised advised)) {            System.out.println(&#187; \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043d\u0435 Spring AOP \u043f\u0440\u043e\u043a\u0441\u0438.&#187;);            System.out.println(&#171;=======================================================\\n&#187;);            return;        }        String proxyType = AopUtils.isCglibProxy(bean) ? &#171;CGLIB (\u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435)&#187;                          : AopUtils.isJdkDynamicProxy(bean) ? &#171;JDK Dynamic Proxy (\u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441)&#187;                          : &#171;\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043f\u0440\u043e\u043a\u0441\u0438&#187;;                System.out.println(&#187; \u251c\u2500\u2500 \u0422\u0438\u043f \u043f\u0440\u043e\u043a\u0441\u0438: &#187; + proxyType);        System.out.println(&#187; \u251c\u2500\u2500 \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 (Target): &#187; + advised.getTargetSource().getTargetClass().getName());        Advisor[] advisors = advised.getAdvisors();        System.out.println(&#187; \u2514\u2500\u2500 \u041d\u0430\u0439\u0434\u0435\u043d\u043e Advisor&#8217;\u043e\u0432: &#187; + advisors.length);        for (int i = 0; i &lt; advisors.length; i++) {            Advisor advisor = advisors[i];                        String orderInfo = &#171;\u041d\u0435 \u0437\u0430\u0434\u0430\u043d&#187;;            if (advisor instanceof Ordered ordered) {                int order = ordered.getOrder();                orderInfo = (order == Ordered.HIGHEST_PRECEDENCE) ? &#171;HIGHEST_PRECEDENCE&#187;                           : (order == Ordered.LOWEST_PRECEDENCE) ? &#171;LOWEST_PRECEDENCE&#187;                           : String.valueOf(order);            }            System.out.printf(&#187;     [%d] %s%n&#187;, i + 1, advisor.getClass().getSimpleName());            System.out.printf(&#187;         \u251c\u2500\u2500 Order: %s%n&#187;, orderInfo);            if (advisor.getAdvice() != null) {                System.out.printf(&#187;         \u2514\u2500\u2500 Advice: %s%n&#187;, advisor.getAdvice().getClass().getName());            } else {                System.out.println(&#187;         \u2514\u2500\u2500 Advice: \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442&#187;);            }        }        System.out.println(&#171;=======================================================\\n&#187;);    }}\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u0432\u0435\u0441\u0443 &#8212; \u043a\u0430\u043a \u0436\u0435 \u0442\u0430\u043c \u0432\u0441\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e?\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430\u0414\u043b\u044f \u0447\u0438\u0441\u0442\u043e\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u043c \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441:  public interface OrderService {    void processOrder();    void outerMethod();}\u0418 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0441 \u0442\u0440\u0435\u043c\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438:@Servicepublic class OrderServiceImpl implements OrderService {    @Cacheable(&#171;orders&#187;)    @Transactional    @LogExecutionTime    public void processOrder() {        System.out.println(&#187;    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!&#187;);    }}@Cacheable(&#171;orders&#187;)\u00a0\u2014 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0435\u0448\u0430 \u0434\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435.@Transactional\u00a0\u2014 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c\u0438, \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\/\u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.@LogExecutionTime\u00a0\u2014 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 AspectJ-\u0430\u0441\u043f\u0435\u043a\u0442.\u0422\u0440\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u044d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c Spring-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438. \u041c\u044b \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u0447\u0442\u043e\u00a0@Cacheable\u00a0\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442,\u00a0@Transactional\u00a0\u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e, \u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439\u00a0@LogExecutionTime\u00a0\u0437\u0430\u043c\u0435\u0440\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0412\u043e\u0442 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface LogExecutionTime {}\u0418 \u0430\u0441\u043f\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0451 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442:  @Aspect@Componentpublic class LogExecutionTimeAspect {    @Around(&#171;@annotation(LogExecutionTime)&#187;)    public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {        System.out.println(&#187;    [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#8230;&#187;);        Object result = joinPoint.proceed();        System.out.println(&#187;    [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.&#187;);        return result;    }}\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437\u00a0@EnableCaching\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0432\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u0432 main \u043a\u043b\u0430\u0441\u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u00a0CommandLineRunner \u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c:  @SpringBootApplication@EnableCachingpublic class SpringProxyApplication {    public static void main(String[] args) {        SpringApplication.run(SpringProxyDemoApplication.class, args);    }    @Bean    public CommandLineRunner runInspector(OrderService orderService) {        return args -&gt; {          System.out.println(orderService.getClass());          orderService.processOrder();    };}\u042f \u0432\u044b\u0437\u044b\u0432\u0430\u044e OrderService. \u041d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435 \u043c\u043e\u0439 \u043a\u043b\u0430\u0441\u0441?\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438: class oleborn.spring.OrderServiceImpl$$SpringCGLIB$$0    [Aspect] \u0421\u0442\u0430\u0440\u0442 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#8230;    [Target] \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 processOrder()!    [Aspect] \u041a\u043e\u043d\u0435\u0446 \u0437\u0430\u043c\u0435\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043d\u043e\u0439 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u043d\u043e\u0432\u0438\u0447\u043a\u0430. \u0412\u0435\u0434\u044c \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c\u00a0class OrderServiceImpl, \u0430 \u0432\u0438\u0434\u0438\u043c \u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u0438\u043c\u044f \u0441\u00a0$$SpringCGLIB$$. \u0418 \u044d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441. \u0415\u0441\u043b\u0438 Spring \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b \u043d\u0430\u0448 \u043e\u0431\u044a\u0435\u043a\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u0433\u0434\u0435-\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 OrderServiceImpl. \u041d\u043e \u043a\u0442\u043e \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b? \u0413\u0434\u0435 \u043e\u043d \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f? \u0418 \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442? \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f&#8230;\u0412\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442:\u00a0\u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0443\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430, Spring \u0432\u0435\u0440\u043d\u0443\u043b \u0431\u044b \u043d\u0430\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439\u00a0OrderServiceImpl, \u0438\u00a0getClass()\u00a0\u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0431\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0432\u044b \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b\u00a0@Transactional, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u043a\u0441\u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u043e.\u041a\u0442\u043e \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b \u043c\u043e\u0439 \u0431\u0438\u043d?\u0416\u0438\u0437\u043d\u044c \u043d\u0430\u0448\u0435\u0433\u043e\u00a0OrderServiceImpl\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e. Spring \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u00a0BeanDefinition, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 &#8212; \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u0442\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043a\u044d\u0448\u0435\u0439, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432. \u041f\u0440\u043e\u0441\u0442\u043e \u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.\u041d\u043e \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0438 \u0442\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0438\u043d \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0ApplicationContext, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440 \u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043f\u043e \u0448\u0430\u0433\u0430\u043c. \u0412 Spring \u0435\u0441\u0442\u044c \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u0432\u0435 \u0444\u0430\u0437\u044b:\u00a0\u0444\u0430\u0437\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u00a0(\u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f) \u0438\u00a0\u0444\u0430\u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u00a0(\u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434). \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043f\u0435\u0440\u0432\u0443\u044e.\u0428\u0430\u0433 1. \u041f\u0435\u0440\u0435\u0445\u0432\u0430\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0430, \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0438\u043d\u0442 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435\u00a0postProcessAfterInitialization()\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u00a0AbstractAutoProxyCreator. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0445\u00a0BeanPostProcessor&#8217;\u043e\u0432, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0441\u044e\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u043d\u0430\u0448 \u0441\u0432\u0435\u0436\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043e\u0442\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0440\u0443\u0436\u0443.\u0421\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: BeanDefinition \u2192 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 OrderServiceImpl (\u0433\u043e\u043b\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442)                    \u2193    \u0432\u0441\u0435 BeanPostProcessor&#8217;\u044b \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442                    \u2193    AbstractAutoProxyCreator.postProcessAfterInitialization()                    \u2193    wrapIfNecessary() \u2014 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438?                    \u2193    \u0435\u0441\u043b\u0438 \u0434\u0430 \u2192 \u0441\u0431\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 getAdvicesAndAdvisorsForBean() Advisor&#8217;\u043e\u0432                    \u2193    \u0447\u0435\u043e\u0435\u0437 createProxy() \u0438 ProxyFactory \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438                    \u2193    \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2192 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u00a0OrderServiceImpl\u00a0\u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, \u043d\u043e \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u043e\u0431\u0451\u0440\u0442\u043e\u043a.\u00a0AbstractAutoProxyCreator\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: \u0435\u0441\u0442\u044c \u043b\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u00a0Advisor&#8217;\u044b? \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0442\u043e \u0431\u0438\u043d \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0445\u0438\u0440\u0443\u0440\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0442\u043e\u043b wrapIfNecessary(). \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c.\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 Spring-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u044d\u0442\u043e\u00a0AnnotationAwareAspectJAutoProxyCreator. \u041a\u043b\u0430\u0441\u0441 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0438 Advisor&#8217;\u044b \u0438 \u0440\u0435\u0448\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0431\u0438\u043d\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c.\u0428\u0430\u0433 2. \u041e\u0442\u043a\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f Advisor&#8217;\u044b?\u041e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440 \u043d\u0430 \u0448\u0430\u0433 \u0432\u043f\u0435\u0440\u0435\u0434, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u00a0getAdvicesAndAdvisorsForBean(). \u0417\u0434\u0435\u0441\u044c Spring \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0432\u0441\u0435 Advisor&#8217;\u044b, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0438\u043d\u0430.\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0432 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0435 \u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0443 \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0438\u043a \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441:\u00a0\u0410 \u043e\u0442\u043a\u0443\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0437\u044f\u043b\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u00a0BeanFactoryTransactionAttributeSourceAdvisor? \u0412\u0435\u0434\u044c \u044f \u0432\u0440\u043e\u0434\u0435 \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u043f\u0438\u0441\u0430\u043b\u00a0new BeanFactoryTransactionAttributeSourceAdvisor()?\u041e\u043d\u0438 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u0432\u043e\u0437\u0434\u0443\u0445\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435, \u0432\u0441\u0451 \u0432\u0441\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0432\u043e\u0438 \u043c\u0435\u0441\u0442\u0430:\u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438\u00a0@EnableCaching\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0431\u0438\u043d\u00a0BeanFactoryCacheOperationSourceAdvisor.\u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u00a0@Transactional\u00a0\u0438 Spring \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u00a0BeanFactoryTransactionAttributeSourceAdvisor\u00a0(\u0447\u0435\u0440\u0435\u0437\u00a0@EnableTransactionManagement, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0435\u0451 \u044f\u0432\u043d\u043e, Spring Boot \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438\u00a0spring-tx\u00a0\u043d\u0430 classpath).\u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 \u0441\u00a0@Aspect\u00a0\u0438\u00a0@Around(&#171;@annotation(LogExecutionTime)&#187;)\u00a0\u0438 Spring \u0441\u043e\u0437\u0434\u0430\u043b\u00a0InstantiationModelAwarePointcutAdvisorImpl\u00a0\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430.\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448 \u0433\u043e\u043b\u044b\u0439\u00a0OrderServiceImpl\u00a0\u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0getAdvicesAndAdvisorsForBean(), Spring \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0441\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0445 \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e Advisor&#8217;\u0430. \u0421\u043e\u0432\u043f\u0430\u043b\u043e? \u041a\u043b\u0430\u0434\u0451\u043c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a.\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0435\u0442\u043e\u0434\u00a0processOrder()\u00a0\u043f\u043e\u043c\u0435\u0447\u0435\u043d \u0442\u0440\u0435\u043c\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438:@Cacheable(&#171;orders&#187;)@Transactional@LogExecutionTimepublic void processOrder() { &#8230; }\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0442\u0440\u0438 Advisor&#8217;\u0430: \u0434\u043b\u044f \u043a\u0435\u0448\u0430, \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0438 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0433\u043e \u0430\u0441\u043f\u0435\u043a\u0442\u0430. \u041f\u043b\u044e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439\u00a0ExposeInvocationInterceptor\u00a0\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u0412\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f:\u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0443\u043c\u0430\u043b\u0438 \u0447\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00a0@Transactional,\u00a0@Cacheable,\u00a0@LogExecutionTime \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u044f\u0432\u043d\u043e \u043a\u0430\u043a-\u0442\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443. \u041d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a Spring \u0441\u043e\u0431\u0440\u0430\u043b Advisor&#8217;\u044b, \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0445\u043e\u0434\u044f\u0442 \u0441\u043e \u0441\u0446\u0435\u043d\u044b. \u0412 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 Java-\u043e\u0431\u044a\u0435\u043a\u0442\u044b:\u00a0TransactionInterceptor,\u00a0CacheInterceptor\u00a0\u0438 \u0432\u0430\u0448\u00a0LogExecutionTimeAspect\u00a0(\u043e\u0431\u0451\u0440\u043d\u0443\u0442\u044b\u0439&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-485010","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485010","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=485010"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/485010\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=485010"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=485010"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=485010"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}