{"id":494980,"date":"2026-09-17T08:10:50","date_gmt":"2026-09-17T08:10:50","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=494980"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=494980","title":{"rendered":"\u041d\u043e\u0432\u044b\u0435 \u0444\u0438\u0447\u0438 Java \u043d\u0443\u0436\u043d\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041c\u0438\u0445\u0430\u0438\u043b \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0430, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0438\u0434\u0435\u0440 <a href=\"https:\/\/github.com\/axelixlabs\/axelix\">\u043f\u0440\u043e\u0435\u043a\u0442\u0430 Axelix<\/a>.<\/p>\n<p>Java \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u043d\u0430 \u0448\u0435\u0441\u0442\u0438\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0435 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0440\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0435 JEP, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439. \u041f\u043e\u0442\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434.<\/p>\n<p>\u0418 \u044d\u0442\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0445\u043e. \u0422\u0430\u0449\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0438\u0447\u0443 \u0432 production \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u043e\u0432\u0430\u044f, \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0432\u044b\u0434\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0435\u0449\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 Java 17, \u0430 \u0433\u0434\u0435-\u0442\u043e \u0431\u043e\u0434\u0440\u043e \u0436\u0438\u0432\u0451\u0442 \u0438 Java 11.<\/p>\n<p>\u041d\u043e \u043e\u0442\u0441\u044e\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441:<\/p>\n<blockquote>\n<p>\u0415\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Java \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445? \u041d\u0435 \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u0435 \u0432 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u043e\u043c pet project, \u0430 \u0432 \u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443?<\/p>\n<\/blockquote>\n<p>\u0414\u0430, \u0435\u0441\u0442\u044c.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 Open Source-\u043a\u043e\u0434\u0430 Axelix:<\/p>\n<ol>\n<li>\n<p>\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>ScopedValue<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c security context \u0438\u0437 HTTP filter-\u0430 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0441\u043b\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u0442\u0430\u043b <code>sealed<\/code>, \u043f\u0440\u0438\u0447\u0451\u043c \u043d\u0435 \u0440\u0430\u0434\u0438 pattern matching \u0438\u043b\u0438 exhaustive <code>switch<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041e\u0434\u0438\u043d \u043f\u0440\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e \u0434\u0438\u0437\u0430\u0439\u043d \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f: <strong>\u0445\u043e\u0440\u043e\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/strong>.<\/p>\n<p>\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043d\u0430\u0447\u043d\u0451\u043c.<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u041f\u0440\u043e Axelix<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.<\/p>\n<p><a href=\"https:\/\/github.com\/axelixlabs\/axelix\">Axelix<\/a> \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u0430\u043a \u0432 \u0434\u0435\u0431\u0430\u0433\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Spring Boot \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0438\u0445. \u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>Axelix Master \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 UI \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 MCP server.<\/p>\n<\/li>\n<li>\n<p>Spring Boot starter-\u044b (+ \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 Build Plugin) \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 Master-\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0447\u0435\u0440\u0435\u0437 UI \u0438\u043b\u0438 AI Agent \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, Master \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a starter-\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 environment, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e bean-\u0430\u0445 \u0438\u043b\u0438 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c cache.<\/p>\n<p>\u0418 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e: <strong>Master \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c starter-\u0443 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0442\u043e\u0433\u043e security context, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f<\/strong>.<\/p>\n<p>\u0422\u043e\u043a\u0435\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e, \u0432\u043d\u0443\u0442\u0440\u0438 servlet filter-\u0430. \u041d\u0443\u0436\u0435\u043d \u043e\u043d \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043d\u0438\u0436\u0435, \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u043c \u0441\u043b\u043e\u0435, \u0433\u0434\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP request.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>SecurityContext<\/code> \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438. \u041f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0432 \u043f\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041f\u043e\u0442\u043e\u043c \u0432 \u0434\u0435\u0441\u044f\u0442\u044c. \u0410 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0422\u0430\u043a \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0448\u0435.<\/p>\n<h3>\u041a\u0435\u0439\u0441 \u041f\u0435\u0440\u0432\u044b\u0439. \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0427\u0435\u0440\u0435\u0437 ThreadLocal<\/h3>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 Java \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>ThreadLocal<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Spring Security \u043d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/p>\n<p>\u0418\u0434\u0435\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f:<\/p>\n<pre><code class=\"java\">private static final ThreadLocal&lt;SecurityContext&gt; CONTEXT = new ThreadLocal&lt;&gt;();void runWithinContext(Runnable action, SecurityContext context) {    SecurityContext previous = CONTEXT.get();    try {        CONTEXT.set(context);        action.run();    } finally {        if (previous == null) {            CONTEXT.remove();        } else {            CONTEXT.set(previous);        }    }}<\/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<p>\u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u043f\u043e call stack-\u0443 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435, \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>CONTEXT.get()<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u0449\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p>\u041d\u0443 \u0433\u0434\u0435 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?<\/p>\n<h4>ThreadLocal \u0414\u0430\u0451\u0442 \u041d\u0430\u043c \u0411\u043e\u043b\u044c\u0448\u0435 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0427\u0435\u043c \u041d\u0443\u0436\u043d\u043e<\/h4>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 <code>ThreadLocal<\/code>: \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e, \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e <code>get()<\/code>, \u043d\u043e \u0438 <code>set()<\/code> \u0438\u043b\u0438 <code>remove()<\/code>. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, <code>ThreadLocal<\/code> \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 shared mutable state &#8212; <strong>\u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0442\u043e\u0440\u043f\u0435\u0434\u0430 \u0432 \u0431\u043e\u0440\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u201c\u043a\u043e\u0440\u0430\u0431\u043b\u044f\u201d<\/strong>.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b context \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0430\u043b\u0451\u043a\u0438\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u044d\u0442\u043e\u0442 context \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c. \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439:<\/p>\n<ol>\n<li>\n<p>Filter \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>Filter \u0441\u043e\u0437\u0434\u0430\u0451\u0442 <code>SecurityContext<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0438\u0436\u0435\u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e\u0442 context \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0438\u043a\u0442\u043e \u043d\u0438\u0436\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u0435\u043d\u044f\u0442\u044c identity \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u043d\u043e <strong>\u043e\u043d\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 security breach!<\/strong> \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f SPI \u0438\u043d\u0435\u0442\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0433\u0430\u0434\u0438\u0442\u044c \u0432 SecurityContext, \u0442\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.<\/p>\n<p>\u041d\u043e \u0443 <code>ThreadLocal<\/code> \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 <code>ThreadLocal<\/code> \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043a\u043e\u0434\u0430. \u041c\u044b \u0441\u0430\u043c\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>remove()<\/code>, \u043e\u0431\u044b\u0447\u043d\u043e \u0432 <code>finally<\/code>. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?<\/p>\n<p>\u0412\u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b, \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043f\u043e \u043a\u0430\u043a\u043e\u0439, \u043d\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u043b\u0438 identity \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f <code>ThreadLocal<\/code> \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f http \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0438 \u0432\u043e\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 Thread \u0438\u0437 \u043f\u0443\u043b\u0430 (\u043f\u043e\u043a\u0430 \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0438 virtual threads \u0438 \u043c\u043e\u0434\u0435\u043b\u044c thread-per-task \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442.\u043a \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f), \u0438 \u0432\u043e\u0442 \u0443\u0436\u0435 security context \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0435\u0445\u0430\u043b \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e <code>SecurityContext<\/code> \u0432 \u043f\u0443\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043c\u0435\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0440\u043e\u043b\u044c\u044e <code>ADMIN<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u043e\u0442\u0435\u0440\u0442\u044c \u0441\u0435\u043d\u0441\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, Axelix \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043d\u0441\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u043e\u043d\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 properties), \u0438 \u043f\u0440\u0430\u0432\u0430 \u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 <code>ADMIN<\/code>. \u0418 \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c <code>SecurityContext<\/code> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0440\u043e\u043b\u044c\u044e <code>ADMIN<\/code>, \u043c\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u0434\u0435\u043b\u0430 \u0434\u0430\u0435\u043c \u043a\u043e\u043c\u0443-\u0442\u043e (\u0431\u0435\u0437 \u0440\u043e\u043b\u0438 <code>ADMIN<\/code>) \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0435\u0440\u043a\u0435\u0442\u044b \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 UI, \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 MCP \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u043f\u0438\u0448\u0435\u0442 <code>try\/finally<\/code>. \u041e\u043d \u043f\u043e\u043a\u0440\u043e\u0435\u0442 \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041e\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0442\u043e \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f.<\/p>\n<h3>ScopedValue. \u041d\u0435 \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0410 \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412 Java 25 <code>ScopedValue<\/code> \u0441\u0442\u0430\u043b \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c API. \u041e\u043d \u0440\u0435\u0448\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0447\u0435\u043c <code>ThreadLocal<\/code>: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u043e call chain \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438. <code>ThreadLocal<\/code> \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0443\u044e \u043a \u043f\u043e\u0442\u043e\u043a\u0443. <code>ScopedValue<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 binding \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 <a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/service\/auth\/ScopedValueSecurityContextExecutor.java\"><code>SecurityContext<\/code> \u0432 Axelix Master<\/a>:<\/p>\n<pre><code class=\"java\">private static final ScopedValue&lt;SecurityContext&gt; SECURITY_CONTEXT =        ScopedValue.newInstance();public &lt;V, T extends Exception&gt; V callWithinSecurityContext(        ThrowingCallable&lt;V, T&gt; callable,        SecurityContext securityContext) throws T {    return ScopedValue            .where(SECURITY_CONTEXT, securityContext)            .call(callable::call);}<\/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>\u0412\u044b\u0437\u043e\u0432 <code>where(...).call(...)<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<blockquote>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438 \u044d\u0442\u043e\u0442 callback \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e scope \u0434\u0430\u043d\u043d\u044b\u0439 <code>ScopedValue<\/code> \u0431\u044b\u043b \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u044d\u0442\u0438\u043c <code>SecurityContext<\/code>.<\/p>\n<\/blockquote>\n<p>\u041a\u043e\u0433\u0434\u0430 callback \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, binding \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0432\u044b\u043b\u0435\u0442\u0435\u043b exception, \u0442.\u043a. <code>ScopedValue<\/code> \u0437\u0430\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0442\u043e\u0436\u0435.<\/p>\n<p>\u0427\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public Optional&lt;SecurityContext&gt; getSecurityContext() {    if (SECURITY_CONTEXT.isBound()) {        return Optional.of(SECURITY_CONTEXT.get());    }    return Optional.empty();}<\/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: \u0443 \u0441\u0430\u043c\u043e\u0433\u043e <code>ScopedValue<\/code> \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 <code>set<\/code>. \u041a\u043e\u0434 \u0432\u043d\u0438\u0437\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c binding, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 <code>ScopedValue<\/code> \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 scope. \u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043d \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 binding.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u0430\u044f \u043d\u0430\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0430 \u0432 API:<\/p>\n<ul>\n<li>\n<p>\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u043a\u043e\u043b \u0441\u0442\u0435\u043a\u0443;<\/p>\n<\/li>\n<li>\n<p>binding \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>callee \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c binding;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0445\u043e\u0434 \u0438\u0437 scope \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 Java \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0441 <code>finally<\/code>, \u0430 <strong>\u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/strong>.<\/p>\n<h3>\u041a\u0430\u043a \u042d\u0442\u043e \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0412 \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0417\u0430\u043f\u0440\u043e\u0441\u0435<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0435\u0441\u044c flow \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442 UI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/filter\/auth\/ExternalApiCookieAuthorizationFilter.java\"><code>ExternalApiCookieAuthorizationFilter<\/code><\/a> , \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c JWT \u0438\u0437 cookie, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f filter chain \u0432\u043d\u0443\u0442\u0440\u0438 security context:<\/p>\n<pre><code class=\"java\">securityContextExecutor.runWithinSecurityContext(        () -&gt; filterChain.doFilter(request, response),        new DefaultSecurityContext(user, token));<\/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>\u0414\u043b\u044f MCP-\u0432\u044b\u0437\u043e\u0432\u0430 IAM flow \u043f\u043e\u0445\u043e\u0436\u0438\u0439, \u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, <a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/filter\/auth\/McpAuthorizationFilter.java\">\u0432\u043e\u0442 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e source \u043a\u043e\u0434<\/a>, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0442\u0443.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 filter chain \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 controller, service \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0418\u043c token \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0435\u043c \u0438\u043c \u0438\u0445 API.<\/p>\n<p>\u0418 \u0443\u0436\u0435 \u0432 <a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/service\/transport\/AbstractEndpointProber.java\"><code>AbstractEndpointProber<\/code><\/a>, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a starter-\u0443, context \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\">SecurityContext securityContext = securityContextExecutor        .getSecurityContext()        .orElseThrow(() -&gt; new IllegalStateException(                \"Security Context is expected to be bound\"));builder.header(        HttpHeaders.AUTHORIZATION,        AuthenticationSchemes.BEARER.prefix() + securityContext.token());<\/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\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 binding \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c token \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 <code>ScopedValue<\/code> \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043b\u044c\u0437\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u043d\u043e!<\/p>\n<h3>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f ScopedValue<\/h3>\n<p>\u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043f\u0440\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e API. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u043d\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u044b\u0435.<\/p>\n<h4>Binding \u041f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u041a \u041f\u043e\u0442\u043e\u043a\u0443<\/h4>\n<p><code>ScopedValue<\/code> \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 <code>CompletableFuture<\/code>, executor \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e servlet-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.<\/p>\n<p>\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 Axelix \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 starter, \u0433\u0434\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f binding \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Authorization<\/code>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 filter chain \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435. \u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 binding \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>StructuredTaskScope<\/code>, \u043d\u043e \u0432 Java 25 \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 Preview API.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 <code>ScopedValue<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 thread pool, \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0442\u0430\u043c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<h4>Binding Immutable, \u0430 \u0432\u043e\u0442 \u041e\u0431\u044a\u0435\u043a\u0442 \u041d\u0435 \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e<\/h4>\n<p><code>ScopedValue<\/code> \u043d\u0435 \u0434\u0430\u0451\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0430\u043c binding. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043b\u043e\u0436\u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u044c mutable-\u043e\u0431\u044a\u0435\u043a\u0442, \u0435\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0441\u0451 \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438. \u041d\u0435 \u0442\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430\u044f \u0434\u043b\u044f <code>ScopedValue<\/code>, \u043e\u043d\u0430 \u0432\u043e\u043e\u0431\u0449\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0438 \u0434\u043b\u044f <code>ThreadLocal<\/code>, \u0438 \u0434\u043b\u044f \u0440\u044f\u0434\u044f \u0434\u0440\u0443\u0433\u0438\u0445 API. \u0412\u043e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435:<\/p>\n<pre><code class=\"java\">ScopedValue&lt;List&lt;String&gt;&gt; VALUE = ScopedValue.newInstance();<\/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>\u0412\u043e\u0442 \u0442\u0443\u0442 \u0441\u0430\u043c binding \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u043c, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <code>VALUE.get().add(...)<\/code>, \u0438 \u0442\u0443\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f <code>ScopedValue<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u043c\u043d\u0438\u0442\u044c.<\/p>\n<h4>\u042d\u0442\u043e \u041d\u0435 \u0423\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0417\u0430\u043c\u0435\u043d\u0430 \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c<\/h4>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043b\u0438\u0431\u043e \u0432 \u044f\u0432\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0432 \u0441\u0438\u0433\u043d\u0443\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440. \u0410 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0435\u044f\u0432\u043d\u043e, \u0442.\u0435. \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b. \u0418 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <strong>\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 API \u0447\u0451\u0442\u043a\u043e \u0438\u0434\u0435\u043d \u0432 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0435<\/strong>.<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0430\u0443\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public interface EndpointProber&lt;O&gt; {    O invoke(HttpPayload payload);}<\/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>\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0430\u043c \u0432\u044b\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"java\">public class DefaultEndpointProber&lt;O&gt; implements EndpointProber&lt;O&gt; {    \/\/ Declared somewhere else, in another class    private static final ScopedValue&lt;InstanceId&gt; TARGET_INSTANCE =            ScopedValue.newInstance();    @Override    public O invoke(HttpPayload payload) {        String accessToken = TARGET_INSTANCE.orElseGet(payload.getToken());        return probe(instanceId, payload);    }}<\/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\u0434 \u0432\u044b\u0448\u0435 \u043e\u0431\u043c\u0430\u043d\u0447\u0438\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e caller \u043c\u043e\u0436\u0435\u0442 \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b token \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430, \u0430 \u043d\u0430 \u0434\u0435\u043b\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u0442\u0434\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0442\u043e\u043a\u0435\u043d\u0430. \u041e\u043f\u044f\u0442\u044c \u0436\u0435, \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0438\u043c\u0435\u043d\u043d\u043e <code>ScopedValue<\/code>, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u043d\u0443\u0436\u043d\u044b\u043c \u044d\u0442\u043e \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442\u044c. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u044e\u0442.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, <code>ScopedValue<\/code> \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 <code>ThreadLocal<\/code> \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u043d\u0438\u0437\u0443, \u043d\u043e \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043a \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0443 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>security context;<\/p>\n<\/li>\n<li>\n<p>tracing context;<\/p>\n<\/li>\n<li>\n<p>tenant;<\/p>\n<\/li>\n<li>\n<p>request metadata.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430 one-way context propagation. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c <code>ScopedValue<\/code>.<\/p>\n<h4>\u041c\u0438\u043a\u0440\u043e-\u0412\u044b\u0432\u043e\u0434<\/h4>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>ScopedValue<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0438\u0437 \u043f\u043e call chain \u0438 \u0436\u0438\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u0430\u044f \u043c\u0443\u0442\u0430\u0446\u0438\u044f, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 Java, <code>ThreadLocal<\/code> \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442. \u041f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <code>set<\/code> \u0438 <code>remove<\/code>.<\/p>\n<h3>\u041a\u0435\u0439\u0441 \u0412\u0442\u043e\u0440\u043e\u0439. \u041f\u0440\u0438\u0447\u0451\u043c \u0422\u0443\u0442 sealed \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b?<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435. \u0418\u043b\u0438, \u043a\u0430\u043a \u0441\u043a\u043e\u0440\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0443 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c &#8212; <strong>\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0438\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0440\u043d\u043e\u0435 (\u044f \u043f\u0438\u0448\u0443 \u043d\u0438\u0436\u0435 \u043f\u043e\u0447\u0435\u043c\u0443)<\/strong>, \u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u044f \u043f\u0438\u0448\u0443 \u0435\u0433\u043e \u0442\u0443\u0442 \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0438 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043c\u043d\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445. \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a.<\/p>\n<p>\u0412 Axelix Master \u0435\u0441\u0442\u044c \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 MCP server. AI Agent \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c MCP tools, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0442\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0447\u0438\u0441\u0442\u043a\u0430 cache. \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 RBAC \u043c\u044b, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0434\u043e\u043b\u0436\u043d\u044b \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435.<\/p>\n<p>\u0420\u0430\u0437\u043d\u044b\u043c MCP endpoint-\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 authority. \u0412 Axelix Master, \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e, \u0435\u0441\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"java\">private static final Map&lt;McpEndpoint, Authority&gt; MAPPING;static {    MAPPING = new HashMap&lt;&gt;(2);    MAPPING.put(McpEndpoints.CLEAR_ALL_CACHES, OssAuthority.CACHES_CLEAR);    MAPPING.put(McpEndpoints.CLEAR_SPECIFIC_CACHE, OssAuthority.CACHES_CLEAR);   \/\/ and so on.}<\/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 \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 JSON RPC \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0432\u044b\u0437\u043e\u0432 MCP tool, \u043c\u044b \u043f\u0430\u0440\u0441\u0438\u043c \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u0438\u043c\u044f MCP endpoint-\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0442\u044b\u043b\u0438\u0441\u044c \u0432\u044b\u0437\u0432\u0430\u0442\u044c, \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <code>McpEndpoint<\/code>. \u0410 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u0430\u043a \u043a\u043b\u044e\u0447 <code>Map<\/code> \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0435 authority.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043a\u0430\u043a \u043a\u043b\u044e\u0447? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0434\u043e\u043c\u0435\u043d\u0430: \u0434\u043b\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0442\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 MCP \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0443\u0436\u0435\u043d \u0442\u0430\u043a\u043e\u0439-\u0442\u043e authority. \u0418\u043c\u0435\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u043e\u043c <code>String<\/code>? \u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u044d\u0442\u0438\u043c \u0431\u044b\u043b\u0438 \u0431\u044b \u0441\u0432\u043e\u0438 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430. \u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u0434\u0435\u0442\u0430\u043b\u0438 \u0443\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435, \u0447\u0442\u043e <code>McpEndpoint<\/code> \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (\u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u0440\u0435\u043d \u043f\u043e\u0442\u044f\u043d\u0443\u043b\u0441\u044f \u0437\u0430 \u043a\u043e\u043b\u044c\u0442\u043e\u043c, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u043d\u044b\u043c \u043a \u0440\u0435\u043c\u043d\u044e!):<\/p>\n<pre><code class=\"java\">public interface McpEndpoint {    String name();}<\/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\u0443 interface \u0438 interface. \u0427\u0442\u043e \u0442\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0439\u0442\u0438 \u043d\u0435 \u0442\u0430\u043a?<\/p>\n<h3>\u041f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 Mutable \u041a\u043b\u044e\u0447 \u0412 HashMap. \u041c\u0438\u043d\u0430 \u0417\u0430\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/h3>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u043d\u044b\u0439 \u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043f\u043e\u0442\u044f\u043d\u0443\u043b\u0441\u044f \u0437\u0430 \u043a\u043e\u043b\u044c\u0442\u043e\u043c? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <em>\u0432 \u043e\u0431\u0449\u0435\u043c \u0438 \u0446\u0435\u043b\u043e\u043c<\/em> <code>McpEndpoint<\/code> \u044d\u0442\u043e \u0438\u043d\u0444\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0438 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f. \u0410 \u043a\u043b\u044e\u0447\u0438 \u0432 <code>Map<\/code> \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u0435, <a href=\"https:\/\/stackoverflow.com\/questions\/34060994\/why-are-keys-immutable-in-java\">\u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0448\u0438\u0440\u043e\u043a\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0444\u0430\u043a\u0442<\/a>.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">final class MutableMcpEndpoint implements McpEndpoint {    private String name;    MutableMcpEndpoint(String name) {        this.name = name;    }    @Override    public String name() {        return name;    }    void rename(String name) {        this.name = name;    }    @Override    public boolean equals(Object other) {        return other instanceof MutableMcpEndpoint endpoint                &amp;&amp; Objects.equals(name, endpoint.name);    }    @Override    public int hashCode() {        return Objects.hash(name);    }}<\/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 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0442\u0430\u043a\u043e\u0439 endpoint \u0432 <code>HashMap<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0435\u0433\u043e \u0438\u043c\u044f:<\/p>\n<pre><code class=\"java\">var endpoint = new MutableMcpEndpoint(\"clearAllCaches\");var mapping = new HashMap&lt;McpEndpoint, Authority&gt;();mapping.put(endpoint, OssAuthority.CACHES_CLEAR);endpoint.rename(\"clearSomethingElse\");Authority authority = mapping.get(endpoint); \/\/ surprise!<\/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>\u0412\u043e \u0432\u0440\u0435\u043c\u044f <code>put<\/code>, HashMap \u0432\u044b\u0431\u0440\u0430\u043b\u0430 bucket \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e <code>hashCode<\/code>. \u041f\u043e\u0441\u043b\u0435 <code>rename<\/code> \u043e\u0431\u044a\u0435\u043a\u0442 \u0432\u044b\u0434\u0430\u0451\u0442 \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u043e\u0439 <code>hashCode<\/code>, \u043d\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0435\u0436\u0438\u0442 \u0432 \u0441\u0442\u0430\u0440\u043e\u043c bucket. Lookup \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043d\u0430\u0439\u0442\u0438 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u0442\u043e\u0439 \u0436\u0435 <code>Map<\/code>.<\/p>\n<p>\u0418 \u043f\u043e\u0443\u043b\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0430\u0439\u0442\u0438 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e <code>McpEndpoint<\/code> \u043d\u0443\u0436\u043d\u0430 \u043a\u0430\u043a\u0430\u044f-\u043b\u0438\u0431\u043e <code>Authority<\/code> \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f &#8212; <strong>\u044d\u0442\u043e \u0436\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 security breach!<\/strong><\/p>\n<p>\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 javadoc:<\/p>\n<blockquote>\n<p>\u0412\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>McpEndpoint<\/code> \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0431\u044b\u0442\u044c immutable \u0438 \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 <code>equals<\/code> \u0438 <code>hashCode<\/code>.<\/p>\n<\/blockquote>\n<p>\u041d\u043e \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u0432\u0435\u0440\u043d\u0443\u043b\u0438\u0441\u044c \u043a \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.<\/p>\n<h3>sealed \u041d\u0443\u0436\u0435\u043d \u041d\u0435 \u0422\u043e\u043b\u044c\u043a\u043e \u0414\u043b\u044f switch<\/h3>\n<p>Sealed classes \u0438 interfaces \u0441\u0442\u0430\u043b\u0438 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u044f\u0437\u044b\u043a\u0430 \u0435\u0449\u0451 \u0432 <a href=\"https:\/\/openjdk.org\/jeps\/409\">Java 17<\/a>. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0445 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u044e\u0442 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0444\u0438\u0433\u0443\u0440:<\/p>\n<pre><code class=\"java\">sealed interface Shape permits Circle, Rectangle {}<\/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\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e compiler \u0437\u043d\u0430\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c exhaustive pattern matching. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 use case.<\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0442\u043e sealed \u0442\u0438\u043f \u043f\u043e \u0441\u0443\u0442\u0438 \u0434\u0435\u043b\u0430 \u043a\u0430\u043a \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430, \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u043d\u0430\u0435\u043c, <strong>\u0430 \u0438\u043c\u0435\u0435\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 \u0432\u0441\u0435\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430<\/strong>. \u0418 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u0438 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0447\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441, <strong>enforcement \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0441\u0442\u0438!<\/strong><\/p>\n<p><a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/mcp\/McpEndpoint.java\"><code>McpEndpoint<\/code> \u0432 Axelix<\/a> \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">public sealed interface McpEndpoint permits DefaultMcpEndpoint {    String name();}<\/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>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/axelixlabs\/axelix\/blob\/master\/master\/src\/main\/java\/com\/axelixlabs\/axelix\/master\/mcp\/DefaultMcpEndpoint.java\"><code>record<\/code><\/a>:<\/p>\n<pre><code class=\"java\">public record DefaultMcpEndpoint(String name) implements McpEndpoint {}<\/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>\u0427\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u0451\u0442 \u0442\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f?<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>McpEndpoint<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b, \u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435 permitted implementations.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>record<\/code>, \u0430 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0442\u0438\u043f <code>String<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f immutable.<\/p>\n<\/li>\n<li>\n<p>Record \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 <code>equals<\/code> \u0438 <code>hashCode<\/code>, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u0434\u0435\u0441\u044c \u043d\u0430 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 <code>name<\/code>.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 <code>McpEndpoint<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0432 <code>Map<\/code>, \u0438\u043c\u0435\u0435\u0442 \u043d\u0443\u0436\u043d\u0443\u044e \u043d\u0430\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043a\u043b\u044e\u0447\u0430.<\/p>\n<p>\u0418 \u0432\u043e\u0442 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439, \u0445\u043e\u0442\u044f \u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f sealed interface: <strong>\u043c\u044b \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0441\u0435\u0445 \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439<\/strong>.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e, \u043f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0440\u0435\u043b\u0430\u0438\u0437\u0430\u0446\u0438\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u043e\u043c, \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 SOLID. \u042d\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u0430\u0432\u0434\u0430, \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0441\u0430\u043c\u0438 <code>sealed<\/code> \u0442\u0438\u043f\u044b \u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u0438\u0440\u043e\u0434\u0435 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u043d\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0435\u0449\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 exhaustive <code>switch<\/code>-\u0435\u0439 &#8212; \u0447\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430\u0440\u0448\u0443\u0435\u043d\u0438\u0435 SOLID \u0432\u043e\u043e\u0431\u0449\u0435-\u0442\u043e, \u0442.\u043a \u043c\u044b \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0435\u0439. \u0422\u0443\u0442 \u0432\u043e\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u0438.<\/p>\n<h3>\u0410 \u041f\u043e\u0447\u0435\u043c\u0443 \u041d\u0435 enum?<\/h3>\n<p>\u0417\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0415\u0441\u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e MCP endpoint-\u043e\u0432 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">enum McpEndpoint {    CLEAR_ALL_CACHES(\"clearAllCaches\"),    CLEAR_SPECIFIC_CACHE(\"clearSpecificCacheEntity\"),      \/\/ and so on...    ;    private final String toolName;    McpEndpoint(String toolName) {        this.toolName = toolName;    }    String toolName() {        return toolName;    }}<\/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 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432\u0430\u043b\u0438\u0434\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430, \u0445\u043e\u0442\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 <code>name()<\/code> \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 <code>Enum<\/code> \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0442\u0430\u043a\u0438\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 endpoint-\u043e\u0432 <code>enum<\/code> \u0434\u0430\u043b \u0431\u044b \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043b\u044c\u043d\u0443\u044e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044e: \u0431\u044b\u043b\u0438 \u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u043e \u0438 \u0441\u0430\u043c\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b.<\/p>\n<p>\u0422\u0435\u043a\u0443\u0449\u0438\u0439 <code>sealed interface<\/code> \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"java\">new DefaultMcpEndpoint(\"clearAllCaches\");<\/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\u0430\u043a\u043e\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f record equality \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0435 \u0441 \u0442\u0435\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c \u0438 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0442\u043e\u0442 \u0436\u0435 \u043a\u043b\u044e\u0447. <code>sealed<\/code> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b, \u0430 \u043d\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u043c\u044b\u0441\u043b? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e enum-\u044b \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043d\u0435\u0433\u0438\u0431\u043a\u0438\u0435, \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u043e\u043d\u0438 \u043d\u0435\u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445 Axelix Master \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 <code>McpEndpoint<\/code>-\u044b, \u0430 enum \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0441\u0435\u0431\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e <strong>extensibility \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 extension point \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c, \u0433\u0434\u0435 \u043e\u043d \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u0435\u043d.<\/strong><\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e sealed-\u043c\u043e\u0434\u0435\u043b\u044c \u0442\u0430\u043a\u0436\u0435 \u043d\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0451\u043d endpoint-\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e endpoint-\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0432\u043e\u0442 \u0442\u0430\u043a\u0438\u0445 \u0432\u043e\u0442 <code>Map<\/code> \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430\u0445;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0433\u043e mapping-\u0430 authority.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 \u0438 \u0437\u0430\u0431\u044b\u043b\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 resolver-\u043e\u0432? Javac \u0442\u0443\u0442 \u043d\u0435 \u0441\u043f\u0430\u0441\u0451\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0441 <code>sealed<\/code> \u0440\u0435\u0448\u0430\u0435\u0442 \u043e\u0434\u043d\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443. \u0418 \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041e\u0442 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u0444\u0438\u0447\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u043f\u043e\u043c\u044b\u043b\u0430 \u043f\u043e\u0441\u0443\u0434\u0443 \u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u043b\u0430 release.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c, \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043d\u0435\u043a\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c\u044e \u0438 immutability.<\/p>\n<h3>\u0427\u0442\u043e \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u042d\u0442\u0438 \u0414\u0432\u0435 \u0424\u0438\u0447\u0438<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0430\u0447\u0430\u043b\u0443 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p><code>ScopedValue<\/code> \u0438 <code>sealed interface<\/code> \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 Java:<\/p>\n<ul>\n<li>\n<p><code>ScopedValue<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><code>sealed interface<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0442\u0438\u043f\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u043e \u0432 \u043d\u0430\u0448\u0438\u0445 \u0434\u0432\u0443\u0445 \u043a\u0435\u0439\u0441\u0430\u0445 \u043e\u043d\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: <strong>\u0441\u0443\u0436\u0430\u044e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/strong>.<\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>ScopedValue<\/code> \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043c:<\/p>\n<blockquote>\n<p>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u041d\u0438\u0436\u0435\u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c.<\/p>\n<\/blockquote>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 <code>sealed interface<\/code>:<\/p>\n<blockquote>\n<p>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u043d\u0430\u043c\u0438 \u0442\u0438\u043f\u044b \u043c\u043e\u0433\u0443\u0442 \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c.<\/p>\n<\/blockquote>\n<p>\u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u0449\u0438\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440\u044b Java \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <a href=\"https:\/\/openjdk.org\/jeps\/8305968\"><code>Integrity by Default<\/code><\/a>: \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c, \u0430 \u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u044f\u0432\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u0438 \u0441\u0442\u043e\u0438\u0442 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044f\u0437\u044b\u043a\u0430. \u041d\u0435 \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0443\u0431\u0440\u0430\u0442\u044c, \u0438 \u043d\u0435 \u043f\u043e \u0442\u043e\u043c\u0443, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u043e\u043d\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435. \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0434\u0440\u0443\u0433\u043e\u0439:<\/p>\n<blockquote>\n<p>\u041a\u0430\u043a\u043e\u0439 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043c\u043e\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0430 \u0444\u0438\u0447\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c \u0438 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c?<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u0442, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0444\u0438\u0447\u0430 \u0432\u0430\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u0435\u0441\u0442\u044c, \u0442\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0438\u0433\u0440\u0443\u0448\u043a\u0430.<\/p>\n<h3>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0443\u043c\u043c\u0438\u0440\u0443\u0435\u043c.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412 \u0421\u0442\u043e\u0440\u043e\u043d\u0443 ScopedValue<\/h4>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>ScopedValue<\/code>, \u0435\u0441\u043b\u0438:<\/p>\n<ol>\n<li>\n<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0438\u0437 \u043f\u043e call chain.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>Callee \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c binding.<\/p>\n<\/li>\n<li>\n<p>Lifetime \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u0435\u0441\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u0430. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 <code>ThreadLocal<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043c\u0443\u0442\u0430\u0446\u0438\u044f, legacy-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 Java.<\/p>\n<h4>\u041a\u043e\u0433\u0434\u0430 \u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0412 \u0421\u0442\u043e\u0440\u043e\u043d\u0443 sealed<\/h4>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 sealed class \u0438\u043b\u0438 interface, \u0435\u0441\u043b\u0438:<\/p>\n<ol>\n<li>\n<p>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u0438\u0434\u043d\u0430 \u0448\u0438\u0440\u043e\u043a\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u0440\u043e\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u0434 \u043e\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0432\u0441\u0435\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<h4>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0418\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u041f\u043e\u0442\u043e\u043c \u0424\u0438\u0447\u0430<\/h4>\n<p>\u041d\u0435 \u043d\u0430\u0434\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u0431\u044b \u043f\u0440\u0438\u0441\u0442\u0440\u043e\u0438\u0442\u044c <code>ScopedValue<\/code>, sealed class, record pattern \u0438\u043b\u0438 virtual thread \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 (\u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043c\u044b \u0436\u0435 \u0442\u0430\u043a \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u043c, \u0432\u0435\u0434\u044c \u043f\u0440\u0430\u0432\u0434\u0430? \u041f\u0440\u0430\u0432\u0434\u0430 \u0432\u0435\u0434\u044c\u2026?).<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0439\u0434\u0438\u0442\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u044d\u0442\u043e\u0442 context \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0442\u0435\u0447\u044c \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u043e\u0442 binding \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043d\u0438\u0437\u0443;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u0443 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0431\u044f\u0437\u0430\u043d \u0438\u043c\u0435\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0443\u044e value semantics.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0443\u0436\u0435 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0431\u0438\u0440\u0430\u0439\u0442\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442.<\/p>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0421\u043b\u043e\u0432\u043e<\/h3>\n<p>\u041d\u043e\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 Java \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u041d\u043e \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u043d\u043e\u0432\u044b\u043c, \u0430 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043b\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 Axelix <code>ScopedValue<\/code> \u0434\u0430\u043b security context, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0439 lifetime \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u043f\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u043a\u043e\u043b\u043b \u0441\u0442\u0435\u043a\u0443 \u043d\u0438\u0436\u0435. \u0410 <code>sealed interface<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d\u043d\u0443\u044e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439, \u043d\u043e \u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 <code>McpEndpoint<\/code>-\u043e\u0432.<\/p>\n<p>\u041e\u0431\u0435 \u0444\u0438\u0447\u0438 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043a\u0438. \u0410 \u044d\u0442\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0438 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043e\u0442 \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u043a\u0440\u044b\u0442, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/github.com\/axelixlabs\/axelix\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Axelix<\/a>.<\/p>\n<p>\u0412\u0441\u0435\u043c \u0443\u0441\u043f\u0435\u0445\u043e\u0432!<\/p>\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\/1083228\/\">https:\/\/habr.com\/ru\/articles\/1083228\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0430 \u0441\u0432\u044f\u0437\u0438 \u041c\u0438\u0445\u0430\u0438\u043b \u041f\u043e\u043b\u0438\u0432\u0430\u0445\u0430, \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043b\u0438\u0434\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Axelix.Java \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0430 \u043d\u0430 \u0448\u0435\u0441\u0442\u0438\u043c\u0435\u0441\u044f\u0447\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0443\u0436\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0434\u0430\u0432\u043d\u043e. \u041a\u0430\u0436\u0434\u044b\u0435 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e, \u0447\u0438\u0442\u0430\u0435\u043c \u043f\u0440\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0435 JEP, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u0441 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439. \u041f\u043e\u0442\u043e\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u044f\u0442\u044c \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434.\u0418 \u044d\u0442\u043e, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043b\u043e\u0445\u043e. \u0422\u0430\u0449\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0438\u0447\u0443 \u0432 production \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0430 \u043d\u043e\u0432\u0430\u044f, \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0432\u044b\u0434\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0451 \u0435\u0449\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 Java 17, \u0430 \u0433\u0434\u0435-\u0442\u043e \u0431\u043e\u0434\u0440\u043e \u0436\u0438\u0432\u0451\u0442 \u0438 Java 11.\u041d\u043e \u043e\u0442\u0441\u044e\u0434\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441:\u0415\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Java \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445, \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445? \u041d\u0435 \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043d\u0435 \u0432 \u0438\u0433\u0440\u0443\u0448\u0435\u0447\u043d\u043e\u043c pet project, \u0430 \u0432 \u043a\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443?\u0414\u0430, \u0435\u0441\u0442\u044c.\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0437 Open Source-\u043a\u043e\u0434\u0430 Axelix:\u041a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c ScopedValue, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c security context \u0438\u0437 HTTP filter-\u0430 \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u044b\u0439 \u0441\u043b\u043e\u0439.\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0441\u0442\u0430\u043b sealed, \u043f\u0440\u0438\u0447\u0451\u043c \u043d\u0435 \u0440\u0430\u0434\u0438 pattern matching \u0438\u043b\u0438 exhaustive switch.\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u044d\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e \u0440\u0430\u0437\u043d\u043e\u0435. \u041e\u0434\u0438\u043d \u043f\u0440\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e \u0434\u0438\u0437\u0430\u0439\u043d \u0442\u0438\u043f\u043e\u0432. \u041d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u0430 \u043e\u0431\u0449\u0430\u044f \u0438\u0434\u0435\u044f: \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0432 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0430\u043c\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430.\u041d\u0443 \u0447\u0442\u043e \u0436\u0435, \u043d\u0430\u0447\u043d\u0451\u043c.\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u041f\u0440\u043e Axelix\u0427\u0442\u043e\u0431\u044b \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u043a\u043e\u0434 \u043d\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.Axelix \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u0430\u043a \u0432 \u0434\u0435\u0431\u0430\u0433\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Spring Boot \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0442\u0430\u043a \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0438\u0445. \u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:Axelix Master \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 UI \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 MCP server.Spring Boot starter-\u044b (+ \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 Build Plugin) \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 Master-\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.\u041a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0447\u0435\u0440\u0435\u0437 UI \u0438\u043b\u0438 AI Agent \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, Master \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a starter-\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 environment, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e bean-\u0430\u0445 \u0438\u043b\u0438 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c cache.\u0418 \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e: Master \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c starter-\u0443 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0442\u043e\u0433\u043e security context, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f.\u0422\u043e\u043a\u0435\u043d \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u043e, \u0432\u043d\u0443\u0442\u0440\u0438 servlet filter-\u0430. \u041d\u0443\u0436\u0435\u043d \u043e\u043d \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043d\u0438\u0436\u0435, \u0432 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u043d\u043e\u043c \u0441\u043b\u043e\u0435, \u0433\u0434\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 HTTP request.\u041c\u043e\u0436\u043d\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c SecurityContext \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438. \u041f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0432 \u043f\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u041f\u043e\u0442\u043e\u043c \u0432 \u0434\u0435\u0441\u044f\u0442\u044c. \u0410 \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0433\u043e\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0435\u043d\u0430 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439.\u0422\u0430\u043a \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u043d\u0430\u043c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0448\u0435.\u041a\u0435\u0439\u0441 \u041f\u0435\u0440\u0432\u044b\u0439. \u041f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0427\u0435\u0440\u0435\u0437 ThreadLocal\u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 Java \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f ThreadLocal, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 Spring Security \u043d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u043b.\u0418\u0434\u0435\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430\u044f:private static final ThreadLocal&lt;SecurityContext&gt; CONTEXT = new ThreadLocal&lt;&gt;();void runWithinContext(Runnable action, SecurityContext context) {    SecurityContext previous = CONTEXT.get();    try {        CONTEXT.set(context);        action.run();    } finally {        if (previous == null) {            CONTEXT.remove();        } else {            CONTEXT.set(previous);        }    }}\u041a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0438\u0436\u0435 \u043f\u043e call stack-\u0443 \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435, \u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c CONTEXT.get() \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0435 \u043d\u0430\u0434\u043e \u0442\u0430\u0449\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b.\u041d\u0443 \u0433\u0434\u0435 \u0436\u0435 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?ThreadLocal \u0414\u0430\u0451\u0442 \u041d\u0430\u043c \u0411\u043e\u043b\u044c\u0448\u0435 \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439, \u0427\u0435\u043c \u041d\u0443\u0436\u043d\u043e\u041f\u0435\u0440\u0432\u0430\u044f \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 ThreadLocal: \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u0434, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0433\u043e, \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e get(), \u043d\u043e \u0438 set() \u0438\u043b\u0438 remove(). \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, ThreadLocal \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 shared mutable state &#8212; \u043e\u043f\u044b\u0442\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0442\u043e\u0440\u043f\u0435\u0434\u0430 \u0432 \u0431\u043e\u0440\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u201c\u043a\u043e\u0440\u0430\u0431\u043b\u044f\u201d.\u0422\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b context \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0434\u0430\u043b\u0451\u043a\u0438\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u044d\u0442\u043e\u0442 context \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c. \u0414\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0442\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u0433\u043e \u043e\u0434\u043d\u043e\u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439:Filter \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.Filter \u0441\u043e\u0437\u0434\u0430\u0451\u0442 SecurityContext.\u041d\u0438\u0436\u0435\u043b\u0435\u0436\u0430\u0449\u0438\u0439 \u043a\u043e\u0434 \u044d\u0442\u043e\u0442 context \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442.\u041d\u0438\u043a\u0442\u043e \u043d\u0438\u0436\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043c\u0435\u043d\u044f\u0442\u044c identity \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0422\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u0430, \u043d\u043e \u043e\u043d\u0430 \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 security breach! \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u043c, \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f SPI \u0438\u043d\u0435\u0442\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0433\u0430\u0434\u0438\u0442\u044c \u0432 SecurityContext, \u0442\u043e \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430.\u041d\u043e \u0443 ThreadLocal \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 ThreadLocal \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 \u043a\u043e\u0434\u0430. \u041c\u044b \u0441\u0430\u043c\u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c remove(), \u043e\u0431\u044b\u0447\u043d\u043e \u0432 finally. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430?\u0412\u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b, \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u043f\u043e \u043a\u0430\u043a\u043e\u0439, \u043d\u0435 \u043e\u0447\u0438\u0441\u0442\u0438\u043b\u0438 identity \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f ThreadLocal \u043f\u043e\u0441\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f http \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0438 \u0432\u043e\u0442 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 Thread \u0438\u0437 \u043f\u0443\u043b\u0430 (\u043f\u043e\u043a\u0430 \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0437\u0430 \u0441\u043a\u043e\u0431\u043a\u0438 virtual threads \u0438 \u043c\u043e\u0434\u0435\u043b\u044c thread-per-task \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u0442.\u043a \u044d\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f), \u0438 \u0432\u043e\u0442 \u0443\u0436\u0435 security context \u043e\u0434\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0435\u0445\u0430\u043b \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441.\u0418 \u0432\u043e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e SecurityContext \u0432 \u043f\u0443\u043b\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043c\u0435\u043b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0440\u043e\u043b\u044c\u044e ADMIN, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043c\u043e\u0442\u0435\u0440\u0442\u044c \u0441\u0435\u043d\u0441\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, Axelix \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u043d\u0441\u0430\u0442\u0438\u0432\u043d\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 (\u043e\u043d\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 properties), \u0438 \u043f\u0440\u0430\u0432\u0430 \u0438\u0445 \u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0443 ADMIN. \u0418 \u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c SecurityContext \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u0440\u043e\u043b\u044c\u044e ADMIN, \u043c\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u0434\u0435\u043b\u0430 \u0434\u0430\u0435\u043c \u043a\u043e\u043c\u0443-\u0442\u043e (\u0431\u0435\u0437 \u0440\u043e\u043b\u0438 ADMIN) \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0435\u0440\u043a\u0435\u0442\u044b \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 UI, \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 MCP \u0441\u0435\u0440\u0432\u0435\u0440.\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430\u043f\u0438\u0448\u0435\u0442 try\/finally. \u041e\u043d \u043f\u043e\u043a\u0440\u043e\u0435\u0442 \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041e\u043d \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u041d\u043e \u0435\u0441\u043b\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0431\u044f\u0437\u0430\u043d \u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0430\u0436\u043d\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439, \u0442\u043e \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0441\u0438\u043b\u044c\u043d\u0430\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f.ScopedValue. \u041d\u0435 \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435, \u0410 \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u0412 Java 25 ScopedValue \u0441\u0442\u0430\u043b \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c API. \u041e\u043d \u0440\u0435\u0448\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043a\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443, \u0447\u0435\u043c ThreadLocal: \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u043d\u0438\u0437 \u043f\u043e call chain \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u043c\u043e\u0434\u0435\u043b\u0438. ThreadLocal \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043a\u0443, \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u0443\u044e \u043a \u043f\u043e\u0442\u043e\u043a\u0443. ScopedValue \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 binding \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.\u0412\u043e\u0442 \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 SecurityContext \u0432 Axelix Master:private static final ScopedValue&lt;SecurityContext&gt; SECURITY_CONTEXT =        ScopedValue.newInstance();public &lt;V, T extends Exception&gt; V callWithinSecurityContext(        ThrowingCallable&lt;V, T&gt; callable,        SecurityContext securityContext) throws T {    return ScopedValue            .where(SECURITY_CONTEXT, securityContext)            .call(callable::call);}\u0412\u044b\u0437\u043e\u0432 where(&#8230;).call(&#8230;) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:\u0412\u044b\u043f\u043e\u043b\u043d\u0438 \u044d\u0442\u043e\u0442 callback \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0435\u0433\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e scope \u0434\u0430\u043d\u043d\u044b\u0439 ScopedValue \u0431\u044b\u043b \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u044d\u0442\u0438\u043c SecurityContext.\u041a\u043e\u0433\u0434\u0430 callback \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f, binding \u0438\u0441\u0447\u0435\u0437\u043d\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041f\u0440\u0438\u0447\u0451\u043c \u043d\u0435\u0432\u0430\u0436\u043d\u043e, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043b\u0438 \u0432\u044b\u043b\u0435\u0442\u0435\u043b exception, \u0442.\u043a. ScopedValue \u0437\u0430\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u0442\u043e\u0436\u0435.\u0427\u0442\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:public Optional&lt;SecurityContext&gt; getSecurityContext() {    if (SECURITY_CONTEXT.isBound()) {        return Optional.of(SECURITY_CONTEXT.get());    }    return Optional.empty();}\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0443 \u0441\u0430\u043c\u043e\u0433\u043e ScopedValue \u043d\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 set. \u041a\u043e\u0434 \u0432\u043d\u0438\u0437\u0443 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c binding, \u043d\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 ScopedValue \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 scope. \u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u043d \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 binding.\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u0430\u044f \u043d\u0430\u043c \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u0443\u0436\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0430 \u0432 API:\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437 \u043f\u043e \u043a\u043e\u043b \u0441\u0442\u0435\u043a\u0443;binding \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438;callee \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0443\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c binding;\u0432\u044b\u0445\u043e\u0434 \u0438\u0437 scope \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u043e\u0432\u0430\u044f \u0444\u0438\u0447\u0430 Java \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a \u0441 finally, \u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043e\u0434\u0430.\u041a\u0430\u043a \u042d\u0442\u043e \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0412 \u0420\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0417\u0430\u043f\u0440\u043e\u0441\u0435\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u0432\u0435\u0441\u044c flow \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u0414\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043e\u0442 UI, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u043d\u0430\u0441 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 ExternalApiCookieAuthorizationFilter , \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c JWT \u0438\u0437 cookie, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0439\u0441\u044f filter chain \u0432\u043d\u0443\u0442\u0440\u0438 security context:securityContextExecutor.runWithinSecurityContext(        () -&gt; filterChain.doFilter(request, response),        new DefaultSecurityContext(user, token));\u0414\u043b\u044f MCP-\u0432\u044b\u0437\u043e\u0432\u0430 IAM flow \u043f\u043e\u0445\u043e\u0436\u0438\u0439, \u043d\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u0432\u043e\u0442 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e source \u043a\u043e\u0434, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0442\u0443.\u0414\u0430\u043b\u044c\u0448\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 filter chain \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0439\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 controller, service \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0418\u043c token \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0435\u043c \u0438\u043c \u0438\u0445 API.\u0418 \u0443\u0436\u0435 \u0432 AbstractEndpointProber, \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a starter-\u0443, context \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f:SecurityContext securityContext = securityContextExecutor        .getSecurityContext()        .orElseThrow(() -&gt; new IllegalStateException(                &#171;Security Context is expected to be bound&#187;));builder.header(        HttpHeaders.AUTHORIZATION,        AuthenticationSchemes.BEARER.prefix() + securityContext.token());\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 binding \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c token \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e\u0442 ScopedValue \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043b\u044c\u0437\u044f. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u043b\u0430\u0441\u0441\u043d\u043e!\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f ScopedValue\u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u043f\u0440\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e API. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u043d\u0438 \u0434\u043b\u044f \u043d\u0430\u0441 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u0441\u0435\u0431\u0435 \u0442\u0435\u0440\u043f\u0438\u043c\u044b\u0435.Binding \u041f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u041a \u041f\u043e\u0442\u043e\u043a\u0443ScopedValue \u043d\u0435 \u043f\u0435\u0440\u0435\u0435\u0437\u0436\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 CompletableFuture, executor \u0438\u043b\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0443\u044e servlet-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443.\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u0434 Axelix \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 starter, \u0433\u0434\u0435 \u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f binding \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a Authorization, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u043d\u0443\u0442\u0440\u0438 filter chain \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435. \u041d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 binding \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 StructuredTaskScope, \u043d\u043e \u0432 Java&#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-494980","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494980","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=494980"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/494980\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=494980"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=494980"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=494980"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}