{"id":453210,"date":"2025-03-25T03:03:54","date_gmt":"2025-03-25T03:03:54","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=453210"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=453210","title":{"rendered":"<span>Spring-\u043f\u043e\u0442\u0440\u043e\u0448\u0438\u0442\u0435\u043b\u044c<\/span>"},"content":{"rendered":"<div><!--[--><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/vk.com\/rtrg?p=VK-RTRG-395749-3h3dN\" style=\"display:none;\" width=\"1\"><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/www.facebook.com\/tr?id=2610199939046212&amp;ev=PageView&amp;noscript=1\" style=\"display:none;\" width=\"1\"><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/xr\/ow\/9s\/xrow9stjbnims1kax70cnjcgnbg.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/xr\/ow\/9s\/xrow9stjbnims1kax70cnjcgnbg.jpeg\" data-blurred=\"true\"\/><\/figure>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u043e \u0441\u043e \u00abSpring-\u043f\u043e\u0442\u0440\u043e\u0448\u0438\u0442\u0435\u043b\u0435\u043c\u00bb \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u0411\u043e\u0440\u0438\u0441\u043e\u0432\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0430\u0447\u0435: \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0435\u0449\u0451 11 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u0430 \u0435\u0451 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0441\u0442\u0443\u0442, \u0438 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0432\u0430\u043b\u0438\u043b\u0438 \u0437\u0430 \u0437\u0430 500 000. \u041f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u0440\u043e\u0439 \u0448\u0442\u0443\u0434\u0438\u0440\u0443\u044e\u0442 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u0438 \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438 \u2014 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u0430\u043a\u043e\u0432\u044b\u0440\u0438\u0441\u0442\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0433\u043e Java-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0435\u0449\u0451 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0414\u0430, \u0447\u0442\u043e-\u0442\u043e \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e (\u0442\u0430\u043c \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0435\u0449\u0451 \u043f\u0440\u043e Java 7), \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0443 \u043d\u0430 \u0432\u043e\u0437\u0440\u0430\u0441\u0442. \u041d\u043e \u0440\u0430\u0437 \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0442\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c Ctrl+F \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 Java-\u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u2014 \u043c\u044b \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u043e\u0432\u0441\u044e \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e <a href=\"https:\/\/jpoint.com\/?utm_source=habr&amp;utm_medium=893638\"><strong>JPoint 2025<\/strong><\/a> (\u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0443\u0436\u0435 3-4 \u0430\u043f\u0440\u0435\u043b\u044f).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043e\u0442 \u043b\u0438\u0446\u0430 \u0441\u043f\u0438\u043a\u0435\u0440\u0430.<\/p>\n<hr\/>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/67e14f534c7c3ebada272a9a\" data-style=\"\" id=\"67e14f534c7c3ebada272a9a\" width=\"\"><\/div>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0440\u0435\u0431\u044f\u0442\u0430! \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c Java \u0441 2001 \u0433\u043e\u0434\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u044f \u0443\u0448\u0435\u043b \u0432 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438\u00bb. \u0421\u0442\u0440\u0430\u0434\u0430\u044e \u043e\u0442 \u0430\u043b\u043b\u0435\u0440\u0433\u0438\u0438 \u043d\u0430 \u0432\u0435\u0441\u043d\u0443, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u044e\u0431\u043b\u044e Spring. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0441 \u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 Spring \u0438 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0438\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u044f\u0442\u044b\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u0435\u0449\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a Spring \u0431\u044c\u0435\u0442 \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u00abSpring \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0445\u00bb \u2014 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ju\/ob\/yi\/juobyinvgel9ea-q_odwf1y5ng8.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ju\/ob\/yi\/juobyinvgel9ea-q_odwf1y5ng8.png\"\/><\/figure>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0442\u0443\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u0438\u0448\u043a\u0438 Spring. \u0418\u0445 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u0421 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f<\/h3>\n<p>26 \u043d\u043e\u044f\u0431\u0440\u044f 2003 \u0433\u043e\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <strong>XmlBeanDefinitionReader<\/strong> \u2014 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Spring, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0432\u0448\u0438\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 XML, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u044b. \u041e\u043d \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 XML \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u0442\u0430\u043c \u043f\u0438\u0448\u0435\u043c, \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 BeanDefinition (\u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u043e \u0431\u0438\u043d\u044b).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u0438\u043d \u0432 Spring. \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Quoter \u2014 \u044d\u0442\u043e \u0446\u0438\u0442\u0430\u0442\u043d\u0438\u043a \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>sayQuote()<\/code><\/p>\n<pre><code class=\"java\">package quoters;  public interface Quoter {   void sayQuote(); } <\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u00abTerminatorQuoter\u00bb:<\/p>\n<pre><code class=\"java\">public class TerminatorQuoter implements Quoter {     private String message;      public void setMessage(String message) {         this.message = message;     }      @Override     public void sayQuote() {         System.out.println(\"message = \" + message);     } } <\/code><\/pre>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 message. \u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0435\u0442\u0442\u0435\u0440: \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 XML \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0435 \u0431\u0435\u0437 \u0441\u0435\u0442\u0442\u0435\u0440\u0430, \u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f XML-\u043d\u043e\u0433\u043e Spring \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438. \u041e\u043d \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0442\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0448\u0435\u043d, \u043d\u043e \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0438 \u0432\u0441\u0451 \u0443\u043f\u0430\u0434\u0451\u0442. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>sayQuote()<\/code> \u043c\u044b \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0443 \u0446\u0438\u0442\u0430\u0442\u0443.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u0432 \u043d\u0430\u0448 XML-\u0444\u0430\u0439\u043b. \u0412 \u043d\u0451\u043c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0433 &lt;beans&gt;, \u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 \u0431\u0438\u043d\u044b.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"     xmlns:context=\"http:\/\/www.springframework.org\/schema\/context\"     xsi:schemaLocation=\"http:\/\/www.springframework.org\/schema\/beans\"&gt;   &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;  &lt;property name=\"message\" value=\"I'll be back\"\/&gt; &lt;\/bean&gt;   &lt;\/beans&gt; <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0431\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <code>terminatorQuoter<\/code>, \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 id \u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c property. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u0442\u0442\u0435\u0440, IDE \u0432 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 <code>message<\/code> \u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 &#171;I&#8217;ll be back&#187;.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0431\u0438\u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 Main (\u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0438\u043d\u0430\u0447\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e). \u0410 \u0432 \u043d\u0451\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 <code>ClassPathXmlApplicationContext<\/code>. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 XmlBeanDefinitionReader, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438. \u042f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 <code>context.xml<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0438\u043d. \u0427\u0438\u0441\u0442\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u0431\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443, \u0442\u0430\u043a \u0438 \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. <strong>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u044b\u0442\u0430\u0449\u0443 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<pre><code class=\"java\">public class Main {     public static void main(String[] args) {         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"context.xml\");         context.getBean(TerminatorQuoter.class).sayQuote();     } } <\/code><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>sayQuote()<\/code>, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0444\u0440\u0430\u0437\u0430 \u00abI&#8217;ll be back\u00bb, \u0432\u0441\u0451 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h3>\u041a\u0430\u043a \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440. \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 2003 \u0433\u043e\u0434\u0443? (\u041f\u043e\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0449\u0435\u0439 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u0441\u044c, \u0434\u043e \u043d\u0438\u0445 \u0435\u0449\u0451 \u0434\u043e\u0439\u0434\u0451\u043c).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qn\/ea\/cb\/qneacblmgjsbf2kdnu_q9iajtqk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qn\/ea\/cb\/qneacblmgjsbf2kdnu_q9iajtqk.png\"\/><\/figure>\n<p>\u041c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b. \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a Spring \u2014 BeanFactory, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0433\u043e \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432 \u0432\u0438\u0434\u0435 \u043f\u0447\u0435\u043b\u043a\u0438. \u0410 \u043d\u0430\u0448 \u0434\u0440\u0435\u0432\u043d\u0438\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 XML \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u0440\u0435\u0432\u043d\u0438\u0439 \u0441\u0432\u0438\u0442\u043e\u043a, \u043c\u044b \u0442\u0430\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0438\u043d \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 BeanDefinitionReader, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437 XML \u0432\u0441\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u043e\u0432 \u0438 \u043a\u043b\u0430\u0434\u0435\u0442 \u0438\u0445 \u0432 map. \u0412 \u044d\u0442\u043e\u0439 map \u0443 \u043d\u0430\u0441 ID \u0431\u0438\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0433\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0445\u043e\u0434\u0438\u0442:<\/p>\n<ul>\n<li>\n<p>\u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0435\u0433\u043e init-\u043c\u0435\u0442\u043e\u0434 \u0438 \u043a\u0430\u043a \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f,<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u0438\u043d\u0430, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 XML.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a BeanDefinitions \u0441\u043e\u0437\u0434\u0430\u043d\u044b, BeanFactory \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c: \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u0438\u043d\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u0438\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0410 \u0432\u0441\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b. \u041a\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f \u2014 \u0442\u043e\u0433\u0434\u0430 Spring \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b, \u043e\u0442\u0434\u0430\u043b \u0438 \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e \u043d\u0435\u0433\u043e.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 destroy-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0431\u0438\u043d\u0430, \u0442\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u0430 \u2014 \u043d\u0435\u0442. \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, Spring \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0438\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f (\u0430 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b), \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438\u0445 destroy-\u043c\u0435\u0442\u043e\u0434\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442. \u0410 \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u044b Spring \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 destroy-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043d\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<h3>BeanPostProcessor<\/h3>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0432\u0435\u0449\u044c \u0432 \u043a\u0438\u0448\u043a\u0430\u0445 Spring \u2014 \u044d\u0442\u043e <strong>BeanPostProcessor<\/strong>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0431\u0438\u043d\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 chain of responsibility. \u041e\u043d \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c Spring, \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0432 \u0431\u0438\u043d\u0435 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u044f \u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0418 \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u043e\u043b\u044f. \u042f \u0432\u0438\u0436\u0443, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443: \u043a\u0442\u043e-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>Math.random()<\/code>, \u043a\u0442\u043e-\u0442\u043e <code>java.util.Random.nextInt()<\/code>, \u043a\u0442\u043e-\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u043a\u0430\u0447\u0430\u043b.<\/p>\n<p>\u042f \u0433\u043e\u0432\u043e\u0440\u044e: \u00ab\u0422\u0430\u043a, \u044d\u0442\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <a class=\"mention\" href=\"\/users\/InjectRandomInt\">@InjectRandomInt<\/a> \u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u043d\u0430\u0434 \u0442\u0435\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438, \u043a\u0443\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c Spring \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00bb.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u041f\u043e\u0439\u0434\u0435\u043c \u0432 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 TerminatorQuoter, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043c \u043f\u043e\u043b\u0435 <code>int<\/code> \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>repeat<\/code>: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0446\u0438\u0442\u0430\u0442\u0443. \u0418 \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 InjectRandomInt, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c. \u0423 \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, min \u0438 max (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0430\u0434\u0438\u043c \u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 2 \u0438 7). \u0410 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>sayQuote()<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0438\u043a\u043b \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"java\">public class TerminatorQuoter implements Quoter {      @InjectRandomInt(min = 2, max = 7)     private int repeat;      private String message;      public void setMessage(String message) {this.message = message;}      @Override     public void sayQuote() {         for (int i = 0; i &lt; repeat; i++) {             System.out.println(\"message = \" + message);     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, IDEA \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c retention policy \u043d\u0430 RUNTIME:<\/p>\n<pre><code class=\"java\">import \u2026  @Retention(RetentionPolicy.RUNTIME) public @interface InjectRandomInt {  \u2026 } <\/code><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0430\u043c \u0441\u0442\u043e\u0438\u0442 CLASS. \u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><strong>SOURCE<\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435, \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, overwrite \u2014 \u044d\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0430. \u041e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>CLASS<\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 reflection \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0432\u044b \u0435\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435, \u0435\u0435 \u0442\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0432\u0435\u0449\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 AST-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>RUNTIME<\/strong> \u0441\u0442\u043e\u0438\u0442 \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0438\u0434\u043d\u044b \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 reflection. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u2014 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430 RUNTIME, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435 \u043f\u0438\u0448\u0443 \u043e\u0431\u044b\u0447\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0443 \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0438\u0445 \u043c\u044b \u0442\u043e\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c.<\/p>\n<pre><code class=\"java\">import \u2026 @Retention(RetentionPolicy.RUNTIME) public @interface InjectRandomInt {  int min(); int max(); <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0449\u0443 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e, \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u00abInjectRandomInt\u00bb. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 repeat \u2014 \u044d\u0442\u043e \u043d\u043e\u043b\u044c, \u0438 \u0446\u0438\u0442\u0430\u0442\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u043b\u044c \u0440\u0430\u0437. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0443\u0447\u0430\u0442\u044c. \u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0441\u0435\u0445 \u0431\u0438\u043d\u043e\u0432, \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u044e\u0442 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043f\u043e\u043b\u0435. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u00abInjectRandomIntAnnotationBeanPostProcessor\u00bb. \u041d\u0443, \u0432\u044b \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Spring \u043a\u043b\u0430\u0441\u0441 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 20 \u0431\u0443\u043a\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e! \u042f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0448\u0443\u0447\u0443, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <a class=\"mention\" href=\"\/users\/Autowired\">@Autowired<\/a> \u0432 Spring \u0432\u043f\u043e\u043b\u043d\u0435 \u0435\u0441\u0442\u044c AutowiredAnnotationBeanPostProcessor, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u044e.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 BeanPostProcessor. \u0423 \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430:<\/p>\n<ul>\n<li>\n<p>postProcessBeforeInitialization (Object bean, String beanName) \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e init-\u043c\u0435\u0442\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p>postProcessAfterInitialization (Object bean, String beanName) \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 init-\u043c\u0435\u0442\u043e\u0434\u0430<\/p>\n<\/li>\n<\/ul>\n<p>\u041e \u0442\u043e\u043c, \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u0445 \u0434\u0432\u0430 \u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u0438\u043c, \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041e\u0431\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u0443\u044e \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0443: \u0432 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u0434\u0435\u0442 \u0431\u0438\u043d \u0438 \u0435\u0433\u043e \u0438\u043c\u044f. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0438\u043d\u0430. \u0412 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u044f \u043c\u043e\u0433\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442. \u0422\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043c\u043e\u0433\u0443 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u0434\u0430\u043b BeanFactory. \u041d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u043c \u0438\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f, \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432 \u043e\u0431\u043e\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 bean.<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u044f \u0445\u043e\u0447\u0443 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 postProcessBeforeInitialization \u0432\u0437\u044f\u0442\u044c \u0431\u0438\u043d, \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>bean.getClass()<\/code>, \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0432\u0441\u0435 \u0435\u0433\u043e \u043f\u043e\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>getDeclaredFields()<\/code> \u0438 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u043d\u0438\u043c. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u00abInjectRandomInt.class\u00bb. \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c: \u0435\u0441\u043b\u0438 \u044d\u0442\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u0430 null, \u0437\u043d\u0430\u0447\u0438\u0442, \u043e\u043d\u0430 \u043d\u0430\u0434 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u043e\u043b\u0435\u043c \u0441\u0442\u043e\u044f\u043b\u0430, \u0438 \u0442\u043e\u0433\u0434\u0430 \u043c\u043d\u0435 \u0438\u0437 \u043d\u0435\u0451 \u043d\u0430\u0434\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c min \u0438 max. \u0417\u0430\u0442\u0435\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043c\u0435\u0436\u0434\u0443 min \u0438 max.<\/p>\n<pre><code class=\"java\">public class InjectRandomIntAnnotationBeanPostProcessor implements BeanPostProcessor {     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {         Field[] fields = bean.getClass().getDeclaredFields();         for (Field field : fields) {             InjectRandomInt annotation = field.getAnnotation(InjectRandomInt.class);             if (annotation != null) {                 int min = annotation.min();                 int max = annotation.max();                 Random random = new Random();                 int i = min + random.nextInt(max - min);                 }             }         return bean;     }      @Override     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {         return bean;     } } <\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c i \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0447\u0438\u0441\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043d\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043f\u043e\u043b\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u0432\u0435\u0449\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0435\u0441\u043b\u0438 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0442\u043e \u043f\u043e\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 private, \u0442\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c <code>field.setAccessible(true)<\/code>. \u0412\u0442\u043e\u0440\u043e\u0435 \u2014 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c <code>field.set(i)<\/code>, <strong>\u043d\u043e \u043c\u044b \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u043c<\/strong>. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0447\u0443\u0436\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0435\u0441\u043b\u0438 \u043e\u043d \u043d\u0435 \u043a\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0442\u043e \u0438 \u043c\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>throws<\/code>. \u0410 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 <code>try<\/code> \u0438 <code>catch<\/code> \u043f\u043b\u043e\u0445\u043e \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043d\u0435\u0440\u0432\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0435\u0441\u0442\u044c \u0443 Spring \u2014 ReflectionUtils, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 reflections, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u0437 try \u0438 catch (\u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0445 \u0438 \u043f\u0440\u044f\u0447\u0435\u0442 \u0432 RuntimeException). \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0435\u0442\u043e\u0434 set.field \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0431\u043e\u043b\u044c\u0448\u0435: \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u044f \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (field), \u0437\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0441\u0443\u043d\u0443\u0442\u044c (\u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e bean), \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u0430\u043c\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u044d\u0442\u043e i). \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u043d\u0438\u043a\u0430\u043a\u0438\u0445 try \u0438 catch.<\/p>\n<pre><code class=\"java\">public class InjectRandomIntAnnotationBeanPostProcessor implements BeanPostProcessor {     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {         Field[] fields = bean.getClass().getDeclaredFields();         for (Field field : fields) {             InjectRandomInt annotation = field.getAnnotation(InjectRandomInt.class);             if (annotation != null) {                 int min = annotation.min();                 int max = annotation.max();                 Random random = new Random();                 int i = min + random.nextInt(max - min);                 field.setAccessible(true);                 ReflectionUtils.setField(field, bean, result);             }         }         return bean;     }      @Override     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {         return bean;     } } <\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u043e\u043f\u0440\u043e\u0441. \u0412\u043e\u0442 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u044d\u0442\u043e\u0442 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441. \u0427\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b Spring \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0443\u0437\u043d\u0430\u043b, \u0438 \u044d\u0442\u043e\u0442 BeanPostProcessor \u044f\u0432\u043b\u044f\u043b\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043c\u043e\u0438 \u0431\u0438\u043d\u044b?<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442! \u0423 Spring \u0432 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u0443\u044e \u0432\u0435\u0449\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 Spring, \u0432\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u041f\u0440\u0438\u0447\u0435\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: \u043c\u043e\u0436\u043d\u043e \u0432 XML, \u0435\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043d\u0438\u043c, \u043c\u043e\u0436\u043d\u043e \u0432 Java config, \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 XML. \u0412\u043e\u0442 \u044f \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e \u0431\u0438\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abInjectRandomInt\u00bb.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"        xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"        xsi:schemaLocation=\" http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\"&gt;   &lt;bean class = \"quoters.InjectRandomIntAnnotationBeanPostProcessor\"\/&gt;      &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;         &lt;property name=\"message\" value=\"I'll be back\"\/&gt;     &lt;\/bean&gt; &lt;\/beans&gt;     <\/code><\/pre>\n<p>ID \u044f \u0435\u043c\u0443 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443: \u044d\u0442\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u0431\u0438\u043d, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u043c\u044b \u0435\u0433\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, Spring \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u0442 \u0435\u043c\u0443 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e ID, \u043d\u043e \u043c\u043d\u0435 \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0431\u0438\u043d\u0430 \u0435\u043c\u0443 \u0432 \u043f\u043e\u043b\u0435 <code>repeat<\/code> \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445.<\/p>\n<p>Init-\u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0434\u0432\u0443\u0445\u0444\u0430\u0437\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440<br \/> \u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <code>postProcessBeforeInitialization()<\/code> \u0438 <code>postProcessAfterInitialization()<\/code>: \u0432 \u043e\u0434\u043d\u043e\u043c \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043b\u043e\u0433\u0438\u043a\u0443, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u044f \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u043a\u0430 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b. \u0410 \u043c\u0435\u0436\u0434\u0443 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f init-\u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0430\u0448\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/im\/j7\/nu\/imj7nunzwzjfdkecolxspfmzarm.png\" data-src=\"https:\/\/habrastorage.org\/webt\/im\/j7\/nu\/imj7nunzwzjfdkecolxspfmzarm.png\"\/><\/figure>\n<p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 XML \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 init-method \u0432 \u0442\u044d\u0433\u0435 bean, \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a class=\"mention\" href=\"\/users\/PostConstruct\">@PostConstruct<\/a>. \u0410 \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441\u043e Spring 2, \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 afterPropertiesSet, \u043d\u043e \u0442\u0430\u043a \u043d\u0438\u043a\u0442\u043e \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441. \u0412 init-\u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 bean, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u0427\u0435\u043c \u043e\u043d \u0441\u0442\u0430\u043b \u043f\u043b\u043e\u0445?<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043f\u0440\u043e \u0434\u0432\u0443\u0445\u0444\u0430\u0437\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043c\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u043c-\u0442\u043e, \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Spring.<\/p>\n<p>\u0412\u0435\u0440\u043d\u0443\u0441\u044c \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441\u0443 TerminatorQuoter. \u0423 \u043c\u0435\u043d\u044f \u0442\u0430\u043c \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0438 \u044f \u0445\u043e\u0447\u0443 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u0432 \u043d\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 repeat. \u0427\u0442\u043e \u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043d\u043e?<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qb\/lc\/yp\/qblcypjnjjdka3aidb_egl3moew.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qb\/lc\/yp\/qblcypjnjjdka3aidb_egl3moew.png\"\/><\/figure>\n<p>\u041d\u043e\u043b\u044c. \u041f\u0440\u0438\u0447\u0435\u043c \u0432 \u043b\u043e\u0433\u0435 \u0443 \u043c\u0435\u043d\u044f \u0444\u0440\u0430\u0437\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f 4 \u0440\u0430\u0437\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0442\u043e\u0438\u0442 \u043d\u043e\u043b\u044c. \u041f\u043e\u0447\u0435\u043c\u0443?<\/p>\n<p>Spring \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u0430\u0433\u0438\u0438. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f Java, Spring \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442: \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f XML, \u0441\u043e\u0437\u0434\u0430\u043b\u0438\u0441\u044c BeanDefinition, Spring \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f TerminatorQuoter. \u041f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 reflection Spring \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0435\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f. \u0418 \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d, Spring \u0435\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u044b \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0432\u0435\u0449\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Spring, <strong>\u044d\u0442\u0438\u0445 \u0432\u0435\u0449\u0435\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0435\u0449\u0435 \u043d\u0435\u0442<\/strong>, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432 \u043b\u0443\u0447\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 NullPointerException, \u0430 \u0432 \u0445\u0443\u0434\u0448\u0435\u043c \u043d\u0443\u043b\u0438. NullPointerException \u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e <em>\u043b\u0443\u0447\u0448\u0435 \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0447\u0435\u043c \u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043d\u0443\u043b\u0435\u043c \u0436\u0438\u0442\u044c<\/em>.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c? \u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>init()<\/code> \u0438 \u0432 \u043d\u0435\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u0440\u0438\u0432\u044b\u043a \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043d\u0430 \u0444\u0430\u0437\u0443 1 \u0438 \u0444\u0430\u0437\u0443 2.<\/p>\n<pre><code class=\"java\">private int repeat;  private String message; public void init(){     System.out.println(\"Phase 2\");     System.out.println(repeat); } public TerminatorQuoter(){     System.out.println(\"Phase 1\"); &lt;...&gt; <\/code><\/pre>\n<p>\u041a\u0430\u043a \u044f \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044d\u0442\u043e init-\u043c\u0435\u0442\u043e\u0434? \u041a\u0430\u043a \u044f \u0441\u043a\u0430\u0437\u0430\u043b, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e PostConstruct, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e XML \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043d\u0438 \u043f\u0440\u043e \u043a\u0430\u043a\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u043d\u043e \u043f\u0440\u043e \u043d\u0438\u0445 \u0437\u043d\u0430\u044e\u0442 BeanPostProcessor. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u043c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0439 BeanPostProcessor, \u0438 \u0441\u0440\u0430\u0437\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u00abInjectRandomInt\u00bb \u0441\u0442\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f? \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u0430\u044f \u0436\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0438 \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 PostConstruct: \u0435\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e BeanPostProcessor.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0437\u0430\u043f\u0443\u0449\u0443 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;Phase 1&#187; \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0430 &#171;Phase 2&#187; \u2014 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0410 \u0432\u043e\u0442 \u0435\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0432 XML \u0431\u0438\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u00abCommonAnnotationBeanPostProcessor\u00bb,\u0442\u043e \u0444\u0430\u0437\u0430 2 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0441\u044f, \u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f repeat \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"     xsi:schemaLocation=\" http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\"&gt;      &lt;bean class = \"org.springframework.context.annotation.CommonAnnotationBeanPostProcessor\"\/&gt;      &lt;bean class = \"quoters.InjectRandomIntAnnotationBeanPostProcessor\"\/&gt;         &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;         &lt;property name=\"message\" value=\"I'll be back\"\/&gt;     &lt;\/bean&gt; &lt;\/beans&gt;     <\/code><\/pre>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wq\/xk\/m1\/wqxkm1yirsysakpdrcrtwowisko.png\" data-src=\"https:\/\/habrastorage.org\/webt\/wq\/xk\/m1\/wqxkm1yirsysakpdrcrtwowisko.png\"\/><\/figure>\n<p>\u0410\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c Annotation Config. \u042d\u0442\u043e \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442: \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u044b \u043d\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u0430\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043c\u0435\u043d \u043d\u0430\u0438\u0437\u0443\u0441\u0442\u044c. \u041a\u0440\u043e\u043c\u0435 \u0432\u0430\u0448\u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u0434\u043b\u044f \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0448\u0442\u0443\u043a \u043f\u044f\u0442\u044c-\u0448\u0435\u0441\u0442\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0442\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435. \u0420\u0430\u0434\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 BeanPostProcessor \u2014 \u044d\u0442\u043e \u0441 \u0443\u043c\u0430 \u0441\u043e\u0439\u0442\u0438 \u043c\u043e\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u0432\u0441\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 namespace, \u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u0438\u0448\u0435\u0442 <a href=\"https:\/\/context:annotation-config\/\">context:annotation-config\/<\/a> \u0438 \u043e\u0442\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e. \u041d\u0430 \u0434\u0435\u043b\u0435 \u044d\u0442\u043e\u0442 namespace \u043f\u0440\u044f\u0447\u0435\u0442 \u043a\u0443\u0441\u043e\u043a XML, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u0435 BeanPostProcessor \u2014 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CommonAnnotation, \u043d\u043e \u0438 \u0435\u0449\u0435 \u0448\u0442\u0443\u043a \u043f\u044f\u0442\u044c.<\/p>\n<p>\u0415\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a: \u0435\u0441\u0442\u044c namespace <a href=\"https:\/\/context:component-scan\/\">context:component-scan\/<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0430\u043a\u0435\u0442. \u041f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0435\u0449\u0435 \u0434\u043e\u0431\u0430\u0432\u044f\u0442\u0441\u044f \u0432\u0441\u0435 BeanPostProcessor.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441\u0435\u0439\u0447\u0430\u0441, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 BeanPostProcessor \u0435\u0441\u0442\u044c. \u0412\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e<br \/> BeanDefinition Document Reader \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u043d\u0430\u0448 XML,<br \/> \u0432\u044b\u0442\u0430\u0449\u0438\u043b BeanDefinition,<br \/> BeanFactory \u0432\u044b\u0442\u0430\u0449\u0438\u043b \u0438\u0437 \u044d\u0442\u0438\u0445 BeanDefinition \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 BeanPostProcessor, \u0441\u043e\u0437\u0434\u0430\u043b \u0438\u0445 \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043a\u0443 \u2014 \u043e\u043d \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0441 \u0435\u0433\u043e \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0431\u0438\u043d\u044b, \u0441 \u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043d \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u043d\u044b.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a: \u0431\u0438\u043d \u043f\u0440\u043e\u0448\u0435\u043b \u043f\u0435\u0440\u0432\u044b\u0435 \u044d\u0442\u0430\u043f\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e BeanPostProcessor, \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430 \u0432\u044b\u0437\u0432\u0430\u043b\u0441\u044f init-\u043c\u0435\u0442\u043e\u0434 (\u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b PostConstruct), \u0438 \u043f\u043e\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0445\u043e\u0434. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 BeanPostProcessor \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yw\/wl\/_c\/ywwl_cuottkcfmtm_zosimw9zec.png\" data-src=\"https:\/\/habrastorage.org\/webt\/yw\/wl\/_c\/ywwl_cuottkcfmtm_zosimw9zec.png\"\/><\/figure>\n<h3>Dynamic Proxy<\/h3>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441. \u0417\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u044b \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430 \u043f\u043e BeanPostProcessor? \u041d\u0435\u0443\u0436\u0435\u043b\u0438 \u0431\u044b\u043b\u043e \u043c\u0430\u043b\u043e \u043e\u0434\u043d\u043e\u0433\u043e?<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043d\u0430\u043f\u0438\u0448\u0443 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0439 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 JMX Console.<\/p>\n<p>\u0418\u0434\u0435\u044f \u0442\u0430\u043a\u0430\u044f: \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a class=\"mention\" href=\"\/users\/Profiling\">@Profiling<\/a>, \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c. \u0422\u043e \u0435\u0441\u0442\u044c \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0432 \u043b\u043e\u0433 \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u0442\u043e\u0434\u0430. \u041a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c?<\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 Profiling \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f: \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0431\u0438\u043d \u043e\u0442 BeanFactory, \u0443\u0442\u043e\u0447\u043d\u044f\u0442\u044c, \u0430 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043b\u0438 \u043d\u0430\u0434 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u043d\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f Profiling, \u0438 \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u0438\u0442, \u0442\u043e \u0435\u043c\u0443 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443: \u0432 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430 \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 Profiling. \u0421\u0430\u043c\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u0430\u044f: \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u0434\u043e, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u0437\u0430\u043c\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d. \u041d\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442?<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0431\u044b \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043d\u0430 Groovy, \u0432\u044b \u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0437\u044f\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0442\u0443\u0434\u0430 \u043b\u043e\u0433\u0438\u043a\u0443. \u0412 Java \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430 \u043b\u0435\u0442\u0443 \u0441\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u043f\u043e\u0434\u043c\u0435\u043d\u044b. \u041a\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442?<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u044f BeanPostProcessor \u0438 \u043c\u043d\u0435 \u0434\u0430\u043b\u0438 \u043d\u0430\u0448\u0435\u0433\u043e TerminatorQuoter. \u042f \u043d\u0430 \u043d\u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u044e \u0438 \u0433\u043e\u0432\u043e\u0440\u044e: \u00ab\u0415\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\u00bb (\u0438\u043b\u0438 \u0441 \u0447\u0435\u043c-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c). \u041e\u043a\u0435\u0439, \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0443\u0434\u0430 \u044d\u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u044f \u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u0434\u0435\u043b\u0430\u044e \u043d\u0435\u043a\u0443\u044e \u0434\u0435\u043a\u043e\u0440\u0430\u0446\u0438\u044e, \u043f\u0440\u043e\u043a\u0441\u0438, \u0438 \u0432\u0435\u0440\u043d\u0443 \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 BeanFactory, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044f \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u043b \u043e\u0431\u044a\u0435\u043a\u0442. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043c\u0435\u043d\u0443 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0434\u043e\u043b\u0436\u0435\u043d \u043b\u0438\u0431\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u044b, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043d\u0443\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043b\u0438\u0431\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0432\u0430 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>dynamic proxy<\/strong> \u2014 \u044d\u0442\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <strong>CGLib<\/strong>. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, CGLib \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0445\u0443\u0436\u0435. \u041e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e\u043d \u0443\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0430 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0445: \u0432\u044b \u043d\u0435 \u043e\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c, \u0435\u0441\u0442\u044c final \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u043c\u0435\u0442\u043e\u0434\u044b.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 Spring \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0434\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b: Spring AOP \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043a\u0441\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0441\u043f\u0440\u0438\u043d\u0433\u043e\u0432\u043e\u043c\u0443 \u0430\u0441\u043f\u0435\u043a\u0442\u0443 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043d \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0442, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b. \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u043e\u043d \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 dynamic proxy, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u043e\u043d \u0438\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 CGLib.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0435 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0432\u0437\u044f\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0442\u043e \u043c\u043e\u0433\u0443 \u043b\u0438 \u044f \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u0437\u0434\u0435\u0441\u044c?<\/p>\n<pre><code class=\"java\">public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {     Field[] fields = bean.getClass().getDeclaredFields();         for (Field field:Fields) {             InjectRandomInt annotation = field.getAnnotation(InjectRandomInt.class);             if(annotation != null) {                 int min = annotation.min();                 int max = annotation.max();                 Random random = new Random();                 int i = min + random.nextInt(max - min);                 field.setAccessible(true);                 ReflectionUtils.setField(field, bean, result);             }         }         return bean; } @Override  public Object postProcessAfterInitialization(Object bean, String beanName) &lt;...&gt;  <\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 BeanPostProcessor \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e <code>get.Class()<\/code> \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0435\u0442\u0430\u0434\u0430\u0442\u0430 \u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0442\u0435\u043c\u0438 \u0436\u0435 \u0441\u0430\u043c\u044b\u043c\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c\u0438. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u0442\u044b \u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439.<\/p>\n<p>\u0427\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f? \u041f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u044f\u043c Spring, \u0442\u0435 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0442\u043e-\u0442\u043e \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u0435\u043d\u044f\u044e\u0442, \u0434\u043e\u043b\u0436\u043d\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 postProcessBeforeInitialization, \u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 postProcessAfterInitialization. PostConstruct \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0430 \u043d\u0435\u0433\u043e \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>\u041c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>ProfilingHandlerBeanPostProcessor<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 <code>BeanPostProcessor<\/code>. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430. \u0418 \u0435\u0449\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e Map \u0441\u043e String \u043f\u0440\u043e\u0442\u0438\u0432 Class \u2014 \u0432 \u043d\u0435\u0439 \u0443 \u043c\u0435\u043d\u044f \u0431\u0443\u0434\u0435\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0438\u043c\u044f \u0431\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e, \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u044f \u0438\u0437 \u0431\u0438\u043d\u0430 \u0431\u0443\u0434\u0443 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c <code>get.Class()<\/code>, \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u043b\u0443\u0447\u0443 \u043b\u0438 \u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u043f\u0440\u043e\u043a\u0441\u0438, \u043d\u043e \u0438\u043c\u044f \u0431\u0438\u043d\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f. \u041e\u0434\u0438\u043d \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u043e\u043c \u2014 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 <code>postProcessBeforeInitialization<\/code> \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0431\u0438\u043d\u043e\u0432, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 <code>postProcessAfterInitialization<\/code> \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<pre><code class=\"java\">public class ProfilingHandlerBeanPostProcessor implements BeanPostProcessor {     private Map&lt;String, Class&gt; map = new HashMap&lt;&gt;();     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException          return null; }       @Override     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException          return null; } <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 postProcessBeforeInitialization \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0440\u0442\u0438\u0442\u044c: \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u0438\u043d, \u0435\u0433\u043e \u0436\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0438. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443: \u0435\u0441\u043b\u0438 \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0441\u0442\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a class=\"mention\" href=\"\/users\/Profiling\">@Profiling<\/a>, \u0442\u043e \u0435\u0433\u043e \u0438\u043c\u044f \u0438 \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 map.<\/p>\n<pre><code class=\"java\">public class ProfilingHandlerBeanPostProcessor implements BeanPostProcessor {     private Map&lt;String, Class&gt; map = new HashMap&lt;&gt;();     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException          Class&lt;?&gt; beanClass = bean.getClass();         if (beanClass.isAnnotationPresent(Profiling.class)) {             map.put(beanName, beanClass);         }         return bean;     }  <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u0430\u043f\u0435 postProcessAfterInitialization \u044f \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u043c\u044d\u043f\u0435 \u0438\u043c\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u0438\u043d\u0430. \u0415\u0441\u043b\u0438 beanClass \u0443 \u043d\u0430\u0441 \u043d\u0435 null, \u0437\u043d\u0430\u0447\u0438\u0442, \u044f \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435. \u0410 \u0435\u0441\u043b\u0438 \u044f \u0435\u0433\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434 \u043d\u0438\u043c \u0441\u0442\u043e\u044f\u043b\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f Profiling, \u0438 \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c return \u043d\u0435 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 dynamic proxy.<\/p>\n<pre><code class=\"java\">@Override  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {     Class beanClass = map.get(beanName);     if (beanClass != null) {         return Proxy.newProxyInstance();     }     return bean; <\/code><\/pre>\n<p>\u0412\u0440\u044f\u0434 \u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439, \u043a\u0430\u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430 \u043b\u0435\u0442\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 Java \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u0442\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0435\u0449\u0451 \u0432 1999-\u043c. \u041c\u0435\u0442\u043e\u0434 newProxyInstance \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0436\u0435 \u0441\u0430\u043c \u043d\u0430 \u043b\u0435\u0442\u0443 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438 \u0432\u0435\u0449\u0438:<\/p>\n<ul>\n<li>\n<p>classLoader, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0441\u044f \u0432 heap \u0432 Java 8 (\u0432 perm \u0432 Java 7);<\/p>\n<\/li>\n<li>\n<p>\u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p>InvocationHandler \u2014 \u043d\u0435\u043a\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0432\u043e \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0442\u043a\u0443\u0434\u0430 \u044f \u0432\u043e\u0437\u044c\u043c\u0443 ClassLoader? \u041c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0435\u0433\u043e \u043e\u0442 \u0431\u0438\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0437\u043d\u0430\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 classLoader \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b, \u0438 \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u0435 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e, \u043f\u0443\u0441\u0442\u044c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442. \u0421\u043f\u0438\u0441\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u044f \u0442\u043e\u0436\u0435 \u0431\u0435\u0440\u0443 \u0438\u0437 \u0431\u0438\u043d\u0430, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u044e \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b, \u0447\u0442\u043e \u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0431\u0438\u043d\u0430. \u0418 InvocationHandler \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"java\">return Proxy.newProxyInstance(beanClass.getClassLoader(), beanClass.getInterfaces(), new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { &lt;...&gt; <\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0430\u043b\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f ProfilingController. \u0423 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0431\u0443\u043b\u0435\u0432\u044b\u0439 \u0444\u043b\u0430\u0433 \u00ab\u0432\u043a\u043b\u044e\u0447\u0435\u043d\/\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u00bb. \u042f \u0441\u0434\u0435\u043b\u0430\u044e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0430 \u043b\u0435\u0442\u0443 \u0432 JMX Console \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e MBean.<\/p>\n<p>\u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0436\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043b\u043e\u0433\u0435. \u042d\u0442\u043e \u0438 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u043b\u043e\u0433 \u0437\u0430\u0441\u043e\u0440\u044f\u0435\u0442. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044e\u0442 \u00ab\u0437\u043b\u044b\u0435 \u0434\u044f\u0434\u0438\u00bb \u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u00ab\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u00bb. \u0412\u043e\u0442 \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u00ab\u043c\u0438\u043d\u0443\u0442\u043e\u0447\u043a\u0443\u00bb, \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043b\u0430\u0436\u043e\u043a \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c: \u00ab\u0430\u0433\u0430, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e\u0440\u043c\u043e\u0437\u044f\u0442 \u0432\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043d\u0435\u0439\u00bb.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 <code>ProfilingController<\/code>:<\/p>\n<pre><code class=\"java\">public class ProfilingController implements ProfilingControllerMBean {     private boolean enabled;      public boolean isEnabled() {         return enabled;     }      public void setEnabled(boolean enabled) {         this.enabled = enabled;     } <\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0436\u043e\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0430\u0440\u0443\u044e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u044e MBean, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0443\u044e \u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 JMX Console \u0432\u0441\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 ProfilingControllerMBean \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0451\u043c \u0442\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 JMX Console.<\/p>\n<pre><code class=\"java\">public interface ProfilingControllerMBean {     void setEnabled(boolean enabled); }  <\/code><\/pre>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043d\u0430\u0448 BeanPostProcessor, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 ProfilingController. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d.<\/p>\n<pre><code class=\"java\">public class ProfilingHandlerBeanPostProcessor implements BeanPostProcessor {     private Map&lt;String, Class&gt; map = new HashMap&lt;&gt;();     private ProfilingContoller controller = new ProfilingController();     @Override     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {         Class&lt;?&gt; beanClass = bean.getClass();         if (beanClass.isAnnotationPresent(Profiling.class)) {             map.put(beanName, beanClass);         }         return bean;     }       @Override      public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {         Class beanClass = map.get(beanName);         if (beanClass != null) {             return Proxy.newProxyInstance(beanClass.getClassLoader(), beanClass.getInterfaces(), new InvocationHandler() {           });     }     return bean;  <\/code><\/pre>\n<p>\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e: \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0434\u0435\u0441\u044c \u0432 Proxy.newProxyInstance() \u043d\u0430\u043f\u0438\u0448\u0443 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u0435\u0442\u0443 \u0438 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u041c\u044b \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u043d\u0430\u0447\u0430\u043b\u0435 \u0438 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430. \u0418 \u0437\u0430\u0442\u0435\u043c \u0432\u0435\u0440\u043d\u0451\u043c \u0442\u043e, \u0447\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434.<\/p>\n<pre><code class=\"java\">public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {     System.out.println(\"\u041f\u0420\u041e\u0424\u0418\u041b\u0418\u0420\u0423\u042e\");     Object retVal = method.invoke(bean, args);     System.out.println(\"\u0412\u0421\u0401\");     return retVal; }  <\/code><\/pre>\n<p>\u0410 \u0435\u0449\u0451 \u0437\u0430\u043c\u0435\u0440\u0438\u043c \u0432\u0440\u0435\u043c\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c System.nanoTime() \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0432\u0435\u0434\u0435\u043c \u0440\u0430\u0437\u043d\u0438\u0446\u0443:<\/p>\n<pre><code class=\"java\">public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {     Class beanClass = map.get(beanName);     if (beanClass !=null) {         return Proxy.newProxyInstance(beanClass.getClassLoader(), beanClass.getInterfaces(), new InvocationHandler() {             @Override             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                 System.out.println(\"\u041f\u0420\u041e\u0424\u0418\u041b\u0418\u0420\u0423\u042e\");                 long before = System.nanoTime();                 Object retVal = method.invoke(bean, args);                 long after = System.nanoTime();                 System.out.println(\"after-before\");                 System.out.println(\"\u0412\u0421\u0401\");                 return retVal;             } &lt;...&gt;  <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0431\u044b\u043b enabled. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u043d\u0443 \u0432 if, \u0438 \u0432 \u043d\u0435\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u2014 \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<pre><code class=\"java\"> public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {     if(controller.isEnabled()){         System.out.println(\"\u041f\u0420\u041e\u0424\u0418\u041b\u0418\u0420\u0423\u042e\");         long before = System.nanoTime();         Object retVal = method.invoke(bean, args);         long after = System.nanoTime();         System.out.println(\"after-before\");         System.out.println(\"\u0412\u0421\u0401\");         return retVal;     } else {         return method.invoke(bean.args);     } &lt;...&gt;  <\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0430 \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043d\u0435 \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435..<\/p>\n<p>\u041c\u044b \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438 \u0441 MBean. \u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u043b \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 MBean, \u043d\u043e \u0435\u0449\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u0432 MBeanServer. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0438 \u043c\u044b \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043d\u0430\u0448\u0435\u043c\u0443 \u0443\u0432\u0430\u0436\u0430\u0435\u043c\u043e\u043c\u0443 ProfilingHandlerBeanPostProcessor. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c<br \/> <code>ManagementFactory.getPlatformMBeanServer()<\/code>.<\/p>\n<p>ManagementFactory \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 Java-\u043a\u043b\u0430\u0441\u0441, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c getPlatformMBeanServer. \u0422\u043e \u0435\u0441\u0442\u044c \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u044d\u0442\u043e\u0433\u043e MBeanServer, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u044b. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u043e Spring \u044d\u0442\u043e \u0432\u0441\u0451 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e.<\/p>\n<p>\u041a\u0430\u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u043d? \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: \u044f \u043f\u0435\u0440\u0435\u0434\u0430\u044e \u0432 \u043c\u0435\u0442\u043e\u0434 registerMBean() \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440, \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0434\u043e \u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0438\u043c\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0447\u0435\u0440\u0435\u0437 JMX Console \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043a\u043e\u043c\u0444\u043e\u0440\u0442\u043d\u043e \u043d\u0430\u0439\u0442\u0438. \u0418\u043c\u044f \u0442\u0438\u043f\u0430 ObjectName \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0432\u0435\u0449\u0435\u0439. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u043c\u0435\u043d, \u043f\u043e\u0434 \u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u043f\u043e\u0447\u043a\u043e\u0439 \u0432 JMX Console \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u044d\u0442\u043e \u00abprofiling\u00bb. \u0418 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u2014 \u0441\u0430\u043c\u043e \u0438\u043c\u044f. \u0411\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u00abcontroller\u00bb.<\/p>\n<pre><code class=\"java\">public ProfilingHandlerBeanPostProcessor() throws Exception {     MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();     platformMBeanServer.registerMBean(controller, new ObjectName(\"profiling\", \"name\", \"controller\")); <\/code><\/pre>\n<p>\u0418\u043c\u0435\u0439\u0442\u0435 \u0432 \u0432\u0438\u0434\u0443, \u0443 \u043d\u0430\u0441 \u0442\u0443\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0432\u0435\u0441\u0442\u0438 \u0442\u044b\u0441\u044f\u0447 exceptions. IDE \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c MalformedObjectNameException, \u044f \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b \u0434\u043e \u043f\u0440\u043e\u0441\u0442\u043e Exception.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"     xsi:schemaLocation=\" http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\"&gt;      &lt;context:annotation-config \/&gt;      &lt;bean class = \"quoters.ProfilingHandlerBeanPostProcessor\"\/&gt;      &lt;bean class = \"quoters.InjectRandomIntAnnotationBeanPostProcessor\"\/&gt;         &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;         &lt;property name=\"message\" value=\"I'll be back\"\/&gt;     &lt;\/bean&gt; &lt;\/beans&gt;     <\/code><\/pre>\n<p>\u0415\u0449\u0451 \u043d\u0430\u0434\u043e \u043a\u043e\u0435-\u0447\u0442\u043e \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0432 \u0444\u0430\u0439\u043b\u0435 main, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u043d\u0451\u043c \u0432\u044b\u0437\u043e\u0432 <code>sayQuote()<\/code> \u0432 <code>while (true)<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0435\u043c\u0443 <code>Thread.sleep(100)<\/code>.<\/p>\n<pre><code class=\"java\">public class Main {     public static void main(String[] args) throws InterruptedException {         ClassPathXmlApplicationContext context = new ClassPathXmlApplication             while (true) {                 Thread.sleep(100);                 context.getBean(TerminatorQuoter.class).sayQuote();             }     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e. \u041e\u043d \u0441\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0438\u0441\u0430\u0442\u044c i\u2019ll be back \u2014 \u043d\u043e \u043d\u0435 \u043f\u0438\u0448\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0447\u0442\u043e-\u0442\u043e \u0443\u043f\u0430\u043b\u043e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/4d\/mx\/cn\/4dmxcn43lsf3qtpgywxa3peysxu.png\" data-src=\"https:\/\/habrastorage.org\/webt\/4d\/mx\/cn\/4dmxcn43lsf3qtpgywxa3peysxu.png\"\/><\/figure>\n<p>\u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u0432\u0430\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c lookup \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0432\u0430\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e? \u0412\u043e\u0442 \u044d\u0442\u043e \u0438 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u043b\u043e. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0431\u044b\u043b \u0431\u044b \u0432\u0430\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c breakpoint \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438 \u0434\u0435\u0431\u0430\u0433\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>context.getBeanDefinitionNames()<\/code> \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0431\u0438\u043d\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0441\u0442\u044c.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/q4\/gs\/rs\/q4gsrs2suuwr3sv0deo8fubcjic.png\" data-src=\"https:\/\/habrastorage.org\/webt\/q4\/gs\/rs\/q4gsrs2suuwr3sv0deo8fubcjic.png\"\/><\/figure>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043a\u0430\u043a \u0438\u0445 \u043c\u043d\u043e\u0433\u043e. \u0418\u0445 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 <code>context:annotation-config<\/code>, \u0438 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0435 \u0432\u043e\u0442 \u044d\u0442\u0438 \u0431\u0438\u043d\u044b \u0442\u0443\u0442 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c: AutowiredAnnotationProcessor, CommonAnnotationProcessor. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u0438 \u043c\u043e\u0439 terminatorQuoter, \u0438\u043c\u044f \u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c.<\/p>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0443 <code>context.getBean(Quoter.class).getClass()<\/code>, \u0442\u043e \u0443\u0432\u0438\u0436\u0443, \u0447\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0435: <code>com.sun.proxy.$Proxy7<\/code>. \u0412\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a\u043e\u0435 \u0441\u0442\u0430\u0440\u043e\u0435? \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u0442\u0430\u043a\u0443\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e Sun?<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u0438 \u0432 \u043a\u043e\u0434\u0435 main \u043d\u0430\u0434\u043e \u0434\u0435\u043b\u0430\u0442\u044c lookup \u043d\u0435 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0437\u043d\u0430\u044e, \u0447\u0442\u043e \u0441 \u043d\u0438\u043c \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f), \u0430 \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c  TerminatorQuoter.class \u043d\u0430 Quoter.class.<\/p>\n<pre><code class=\"java\">public class Main {     public static void main(String[] args) {         new ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"context.xml\");         context.getBean(Quoter.class).sayQuote ();     } } <\/code><\/pre>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d \u0444\u043b\u0430\u0436\u043e\u043a \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0432 \u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0444\u0440\u0430\u0437\u0430 \u00abI\u2019ll be back\u00bb.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0423 \u043c\u0435\u043d\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Java 7. \u0417\u043d\u0430\u0435\u0442\u0435 jvisualvm (Java VisualVM)? \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0435\u0433\u043e, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443. \u0415\u0441\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f MBeans, \u044f \u0435\u0433\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Tools \u2014 Plugins.<\/p>\n<p>\u0412 \u043d\u0451\u043c \u0443 \u043c\u0435\u043d\u044f \u0432\u0438\u0434\u043d\u043e \u043f\u0443\u043d\u043a\u0442 profiling. \u041a\u043e\u0433\u0434\u0430 \u044f \u043e\u0442\u043a\u0440\u043e\u044e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433, \u044f \u0443\u0432\u0438\u0436\u0443 controller \u2014 \u044d\u0442\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0435\u0433\u043e MBean. \u0417\u0430\u0439\u0434\u0435\u043c \u0432 \u043d\u0435\u0433\u043e, \u0438 \u0443 \u043d\u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 Attributes \u0435\u0441\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u00abenabled\u00bb. \u042f \u043d\u0430\u043f\u0438\u0448\u0443 true \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 \u043d\u0435\u0433\u043e \u0432 \u043a\u043e\u043b\u043e\u043d\u043a\u0435 value \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0441\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 IntelliJ.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043b\u043e\u0433\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u00ab\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u044e\u2026\u00bb, \u0438 \u0434\u0430\u0436\u0435 \u0431\u0435\u0433\u0443\u0442 \u0446\u0438\u0444\u0440\u044b:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/dq\/py\/to\/dqpytopaphe1hycxnsnyb_kwoq4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/dq\/py\/to\/dqpytopaphe1hycxnsnyb_kwoq4.png\"\/><\/figure>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u043d\u0430\u0448\u043b\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u00ab\u0433\u0434\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u00bb, \u0438 \u0445\u043e\u0442\u0438\u043c \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u041c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0432 jVisualVM, \u043f\u0438\u0448\u0435\u043c \u043d\u0430\u043f\u0440\u043e\u0442\u0438\u0432 enabled \u00abfalse\u00bb, \u0438 \u043d\u0438\u043a\u0442\u043e \u0443 \u043d\u0430\u0441 \u0432 IDE \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u0443\u0435\u0442. \u0421\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u0441\u044c, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043c\u043e\u0433\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u00abProfiling\u00bb \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0434 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043b\u044e\u0431\u044b\u043c \u0441\u0432\u043e\u0438\u043c \u0431\u0438\u043d\u043e\u043c, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u044f \u0431\u0443\u0434\u0443 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0432\u043e\u044e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0441\u0432\u043e\u0439 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u0430. \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, BeanPostProcessor \u043c\u043e\u0433\u0443\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0438\u043d \u043f\u043e\u0434\u043a\u0440\u0443\u0442\u0438\u0442\u044c, \u043d\u043e \u043e\u043d\u0438 \u0435\u0449\u0435 \u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u2014 \u0435\u0441\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e dynamic proxy \u0438 CGLib.<br \/> ApplicationListener<br \/> \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0442\u0440\u0435\u0445\u0444\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u043f\u0440\u043e ApplicationListener, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u0442\u043e\u0442 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0437\u0430\u0442\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u044e.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/y5\/ht\/pv\/y5htpvvfdlu4dhmo8k2gvcab9v0.png\" data-src=\"https:\/\/habrastorage.org\/webt\/y5\/ht\/pv\/y5htpvvfdlu4dhmo8k2gvcab9v0.png\"\/><\/figure>\n<p>Listener \u0443\u043c\u0435\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 Spring, \u0432\u0441\u0435 \u0438\u0432\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441 \u043d\u0438\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442. \u0410 \u0441 \u043d\u0438\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0449\u0438 \u0432\u0440\u043e\u0434\u0435 ContextStarted \u0438\u043b\u0438 ContextStopped. \u041d\u043e \u0441\u0430\u043c\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438\u0432\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e ContextRefreshedEvent. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0440\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 ContextStarted \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0435\u0449\u0435 \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b\u0441\u044f, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f. \u0410 \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0432\u043e\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0435\u0444\u0440\u0435\u0448. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d Listener, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u00ab\u0440\u0435\u0444\u0440\u0435\u0448\u043d\u0443\u043b\u0441\u044f\u00bb.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c, \u0437\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 warm\u0421ache(), \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0440\u0430\u0437\u043e\u0433\u0440\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u044d\u0448. \u041e\u043d \u0438\u0434\u0435\u0442 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043c \u0434\u0435\u043b\u0430\u0435\u0442, \u0447\u0442\u043e-\u0442\u043e \u0431\u0435\u0440\u0435\u0442, \u043c\u0435\u043d\u044f\u0435\u0442, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442, \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0432\u043e\u0439 collection \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u2014 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043e\u043d \u0433\u043e\u0442\u043e\u0432.<\/p>\n<p>\u0413\u0434\u0435 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434? \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u2014 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043d\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0435\u0449\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e: \u0431\u0438\u043d \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u044f\u0432\u043d\u043e \u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0435\u0449\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0438\u0448\u0435\u043c PostConstruct, \u043f\u0438\u0448\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0442\u0443\u0434\u0430 \u2014 \u0438 \u0442\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u0435\u0447\u0430\u043b\u044c\u043a\u0430. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c-\u0442\u043e \u043e\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043d\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0431\u043e\u0442\u044b PostConstruct \u0435\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b.<\/p>\n<p>\u041f\u043e\u043d\u044f\u0442\u043d\u043e \u043b\u0438, \u043f\u043e\u0447\u0435\u043c\u0443? \u041d\u0430\u0434 \u043d\u0430\u0448\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c warmCache() \u0441\u0442\u043e\u0438\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a class=\"mention\" href=\"\/users\/Transactional\">@Transactional<\/a>, \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043a\u0430\u043a \u0441 <a class=\"mention\" href=\"\/users\/Profiling\">@Profiling<\/a>. \u041d\u043e \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u0437\u0430\u043f\u0438\u0445\u0430\u0435\u0442 \u043c\u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0441 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0443? \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a PostConstruct \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e, \u043a\u0430\u043a \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u0442\u0430\u043f\u044b: postProcessBeforeInitialization, \u043f\u043e\u0442\u043e\u043c PostConstruct, \u0430 \u043f\u043e\u0441\u043b\u0435 \u0443\u0436\u0435 postProcessAfterInitialization. \u0422\u043e \u0435\u0441\u0442\u044c PostConstruct \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438\u0441\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0442\u0435 \u043f\u0440\u043e\u043a\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c? \u042f \u0445\u043e\u0447\u0443 \u0438\u043c\u0435\u0442\u044c \u0442\u0440\u0435\u0442\u044c\u044e \u0444\u0430\u0437\u0443 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430. \u041f\u043e\u0439\u0434\u0443 \u0432 \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b TerminatorQuoter \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044e \u043d\u0430\u0434 sayQuote \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <a class=\"mention\" href=\"\/users\/PostConstruct\">@PostConstruct<\/a>. \u041e\u043d\u0430 \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0430\u0434 init(), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0434\u0432\u0430 PostConstruct \u0432 \u0444\u0430\u0439\u043b\u0435, \u044d\u0442\u043e \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442.<\/p>\n<pre><code class=\"java\">@PostConstruct public void sayQuote() {     for (int i = 0; i &lt; repeat; i++) {         System.out.println(\"message = \" + message);     } <\/code><\/pre>\n<p>\u0412\u043a\u043b\u044e\u0447\u0443 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435: \u0432 <code>ProfilingController<\/code> \u043a \u0441\u0442\u0440\u043e\u043a\u0435 <code>private boolean enabled<\/code> \u0434\u043e\u0431\u0430\u0432\u043b\u044e <code>=true<\/code>.<\/p>\n<p>\u042f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u0438 \u0432\u0438\u0436\u0443, \u0447\u0442\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442!<\/p>\n<p>\u0418\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043d\u0430\u0448 main-\u0444\u0430\u0439\u043b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0442\u0442\u0443\u0434\u0430 sayQuote():<\/p>\n<pre><code class=\"java\">public class Main {     public static void main(String[] args) throw InterruptedException {         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"context.xml\");         context.getBean(Quoter.class).sayQuote();     } } <\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0435\u043f\u0435\u0440\u044c sayQuote() \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u0432\u0430\u0436\u0434\u044b, \u0438\u0437 Main \u0438 \u0438\u0437 PostConstruct. \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043e\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u0435\u0437 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437 \u0441 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u043e\u0447\u0435\u043c\u0443? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 PostConstruct \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043a\u0441\u0438 \u043d\u0435\u0442\u0443.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0432 \u0444\u0430\u0439\u043b\u0435 TerminatorQuoter, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <a class=\"mention\" href=\"\/users\/PostProxy\">@PostProxy<\/a>. \u0418 \u0441\u0435\u0431\u0435 \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u044f \u0444\u0430\u0437\u0430.<\/p>\n<pre><code class=\"java\">@Override @PostProxy public void sayQuote() {     System.out.println(\"3 phase\");     for (int i = 0; i &lt; repeat; i++) {         System.out.println(\"message = \" + message);     } } <\/code><\/pre>\n<p>\u042f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b <a class=\"mention\" href=\"\/users\/PostProxy\">@PostProxy<\/a>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0441\u0430\u043c\u0438 \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0451 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438 \u0432\u0441\u0435 \u043f\u0440\u043e\u043a\u0441\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e ContextListener, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0434\u043e\u0441\u0442\u0443\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0436\u0435, \u0447\u0435\u043c PostConstruct.<\/p>\n<p>\u041f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0438 \u043f\u0438\u0448\u0435\u043c listener \u2014 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 PostProxyInvokerContextListener, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 ApplicationListener.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u00abinoker\u00bb \u0432\u043c\u0435\u0441\u0442\u043e \u00abinvoker\u00bb. \u0412\u044b \u0432 \u043a\u0443\u0440\u0441\u0435, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a? \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0438\u0449\u0435\u0448\u044c \u00ab\u0430 \u0432\u0434\u0440\u0443\u0433 \u0443\u0436\u0435 \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u043b\u00bb. \u041d\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u0438 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0448\u044c, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430. \u041f\u043e\u0442\u043e\u043c \u0435\u0449\u0451 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043d\u0438\u0445 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u0433, \u043f\u044b\u0442\u0430\u0435\u0448\u044c\u0441\u044f \u0447\u0438\u043d\u0438\u0442\u044c \u043d\u0435 \u0442\u043e\u0442\u2026<\/p>\n<p>\u0412\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e IDE \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0436\u0435\u043d\u0435\u0440\u0438\u043a? \u0415\u0441\u0442\u044c \u043f\u044f\u0442\u044c \u0438\u0432\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u044f\u0442\u044c \u2014 \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e ContextRefreshed. \u0418 \u044f \u043d\u0435 \u0445\u043e\u0447\u0443 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0438\u0441\u0430\u0442\u044c, \u0434\u0435\u043b\u0430\u0442\u044c instanceof \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0443\u0442 generic \u0438 \u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0441\u043b\u0443\u0448\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e ContextRefreshedEvent. \u0418 \u0432 \u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u0438\u0432\u0435\u043d\u0442:<\/p>\n<pre><code class=\"java\">public class PostProxyInvokerContextListener implements ApplicationListener&lt;ContextRefreshedEvent&gt;     @Override     public void onApplicationEvent(ContextRefreshedEvent event) {      } } <\/code><\/pre>\n<p>\u0418\u0437 \u0438\u0432\u0435\u043d\u0442\u0430 \u044f \u043c\u043e\u0433\u0443 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c ApplicationContext \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043a\u0443 (<code>ApplicationContext context = event.getApplicationContext()<\/code>). \u0418\u0437 Context \u044f \u0445\u043e\u0447\u0443 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u0441\u0432\u043e\u0438\u0445 \u0431\u0438\u043d\u043e\u0432 (<code>String[] names = context.getBeanDefinitionNames()<\/code>), \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043d\u0435 \u0441\u0442\u043e\u044f\u043b\u0430 \u043b\u0438 \u0432 \u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f <a class=\"mention\" href=\"\/users\/PostProxy\">@PostProxy<\/a>.<\/p>\n<p>\u0412\u043e\u043f\u0440\u043e\u0441: \u043c\u043e\u0433\u0443 \u043b\u0438 \u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0431\u0438\u043d\u0430 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0431\u0438\u043d \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u0443 \u043d\u0435\u0433\u043e get.Class? <strong>\u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u043d\u0435\u0442<\/strong>. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0442\u0430\u043c \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043a\u0441\u0438. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u0434\u0435\u043b\u0430\u044e get.Class \u0443 \u0442\u043e\u0433\u043e \u0431\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0441\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 $Proxy7 \u043a\u043b\u0430\u0441\u0441, \u0433\u0434\u0435 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0444\u0430\u0431\u0440\u0438\u043a\u043e\u0439 Spring. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0435\u0451 \u0441\u044e\u0434\u0430 \u0438\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u0442\u044c. \u0414\u043e\u0431\u0430\u0432\u0438\u043c <code>private ConfigurableListableBeanFactory<\/code>. \u0412\u0438\u0434\u0438\u0442\u0435, \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u043b\u0438\u0434\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f!<\/p>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0431\u0440\u0438\u043a\u0430 \u0443\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c <code>getBeanDefinition()<\/code>. \u0412\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0431\u0438\u043d \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e: \u0435\u0441\u043b\u0438 \u0432\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u0431\u0438\u043d \u043a\u0430\u043a Lazy, \u0442\u043e \u043e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u0410 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0438\u043d\u0430\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d <a class=\"mention\" href=\"\/users\/PostProxy\">@PostProxy<\/a>, \u0432\u0435\u0434\u044c \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u0442\u043e \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u044f \u0441\u043e\u0437\u0434\u0430\u043b \u0431\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u0438 \u0431\u0438\u043d\u044b, \u0430 \u043d\u0430\u0434\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 BeanDefinition \u0438 \u0432 \u043d\u0438\u0445 \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442.<\/p>\n<pre><code class=\"java\">public class PostProxyInvokerContextListener implements ApplicationListener&lt;ContextRefreshedEvent&gt;,     @Autowired     private ConfigurableListableBeanFactory factory;     @Override     public void onApplicationEvent(ContextRefreshedEvent event) {         ApplicationContext context = event.getApplicationContext();         String[] names = context.getBeanDefinitionNames();         for (String name : names){             factory.getBeanDefinition(name);         }     } }  <\/code><\/pre>\n<p>\u041a\u0442\u043e-\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043e\u043f\u043d\u0435\u0442 \u043d\u043e\u0433\u0430\u043c\u0438 \u0438 \u0441\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0443\u0436\u0430\u0441\u043d\u0443\u044e \u0432\u0435\u0449\u044c: \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u0438\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u043b Spring factory, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u044d\u0442\u043e coupling. \u041d\u043e \u0442\u043e, \u0447\u0442\u043e \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0438\u0448\u0443, \u2014 \u044d\u0442\u043e ApplicationListener, \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c Spring \u0432 Spring \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u0412\u043e\u0442 \u0435\u0441\u043b\u0438 \u0431\u044b \u044f \u0432 TerminatorQuoter \u0438\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u043b Context \u2014 \u0432\u043e\u0442 \u044d\u0442\u043e \u0431\u044b\u043b \u0431\u044b \u0443\u0436\u0430\u0441. \u0418\u043c\u0435\u0439\u0442\u0435 \u044d\u0442\u043e \u0432 \u0432\u0438\u0434\u0443, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Spring \u043a\u0430\u043a \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u0435\u043b\u0430\u044f lookup \u0438\u0437 Context.<\/p>\n<p>\u0418\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u0412\u044b\u0442\u0430\u0449\u0438\u043b\u0438 beanDefinition \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0431\u0443\u0434\u0435\u043c \u0441 \u043d\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c. \u0418\u0437 \u043d\u0435\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c string, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0438\u043d\u0430: <code>getBeanClassName()<\/code>.<\/p>\n<pre><code class=\"java\">for (String name : names) {     BeanDefinition beanDefinition = factory.getBeanDefinition(name);     String originalClassName = beanDefinition.getBeanClassName(); } <\/code><\/pre>\n<p>\u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <code>Class.forName()<\/code> \u043f\u043e\u043b\u0443\u0447\u0443 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430. \u041e\u0442 exceptions \u0442\u0443\u0442 \u0443\u0436\u0435 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0443\u0439\u0442\u0438. \u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0443\u0441\u0442\u043e\u0439 catch \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c, \u0433\u0440\u0435\u0445. \u0410 \u043a\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0433\u0440\u0435\u0448\u0438\u043b?<\/p>\n<p>\u0423 originalClass \u043c\u044b \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043d\u0438\u043c, \u0438 \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u043e\u0432\u0430\u043d <a class=\"mention\" href=\"\/users\/PostProxy\">@PostProxy<\/a>, \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0430\u0434\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041d\u043e \u043f\u0440\u043e\u0441\u0442\u043e method.invoke \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u0447\u0435\u0440\u0435\u0437 CGLib \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0431\u044b, \u0430 \u0447\u0435\u0440\u0435\u0437 dynamic proxy \u043d\u0435\u0442). \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0438\u0449\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0430 \u0431\u0438\u043d \u0443 \u043c\u0435\u043d\u044f \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u043a\u0441\u0438. \u042d\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0418 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0441\u0430\u043c \u0431\u0438\u043d.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043c\u043e\u0435\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443 \u0438 \u0441\u043a\u0430\u0436\u0435\u043c \u00ab\u043d\u0443-\u043a\u0430 \u0434\u0430\u0439 \u043c\u043d\u0435 \u0431\u0438\u043d \u043f\u043e \u0432\u043e\u0442 \u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438\u00bb:<\/p>\n<pre><code class=\"java\">for (String name : names) {     BeanDefinition beanDefinition = factory.getBeanDefinition(name);     String originalClassName = beanDefinition.getBeanClassName();     try {         Class&lt;?&gt; originalClass = Class.forName(originalClassName);         Method[] methods = originalClass.getMethods();         for (Method method : methods) {             if (method.isAnnotationPresent(Postproxy.class)) {                 Object bean = context.getBean(name);             }         }     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0431\u0438\u043d \u0438 \u0432\u044b\u0442\u0430\u0449\u0438\u043c \u0438\u0437 \u043d\u0435\u0433\u043e \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u044b\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441 \u043f\u0440\u043e\u043a\u0441\u0438, \u0443 \u043d\u0435\u0433\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u043c \u043c\u0435\u0442\u043e\u0434. \u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 $Proxy7 \u0438 TerminatorQuoter, \u0438 \u043e\u043d\u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436\u0438\u0435, \u0443 \u043d\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u0438 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>getMethod()<\/code> \u2014 \u043e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430 \u0438 \u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u0438 \u043a\u0438\u0434\u0430\u0435\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c exception). \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043a\u0430\u043a currentMethod \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u043c \u0432\u0435\u0440\u043d\u0451\u0442. \u0418 \u0437\u0430\u0442\u0435\u043c \u044f \u043c\u043e\u0433\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 currentMethod, \u043f\u0440\u0438\u0447\u0435\u043c \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 ReflectionUtils, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e try \u0438 catch \u0443 \u043c\u0435\u043d\u044f \u0443\u0436\u0435 \u0441\u0442\u043e\u044f\u0442.<\/p>\n<pre><code class=\"java\">if (method.isAnnotationPresent(Postproxy.class)) {     Object bean = context.getBean(name);     Method currentMethod = bean.getClass().getMethod(method.getName(), method.getParameterTypes());     currentMethod.invoke(bean); } <\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u044d\u0442\u043e\u0442 \u0431\u0438\u043d \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u0418\u0434\u0435\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0442\u0430\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c bean \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 PostProxyInvokerContextListener.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"     xsi:schemaLocation=\" http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\"&gt;      &lt;context:annotation-config \/&gt;      &lt;bean class = \"quoters.PostProxyInvokerContextListener\"\/&gt;     &lt;bean class = \"quoters.ProfilingHandlerBeanPostProcessor\"\/&gt;      &lt;bean class = \"quoters.InjectRandomIntAnnotationBeanPostProcessor\"\/&gt;         &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;         &lt;property name=\"message\" value=\"I'll be back\"\/&gt;     &lt;\/bean&gt; &lt;\/beans&gt;     <\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u2014 \u0438 \u0432\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e!<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zt\/wm\/05\/ztwm05twhhlrbja0owgg6nbk0jw.png\" data-src=\"https:\/\/habrastorage.org\/webt\/zt\/wm\/05\/ztwm05twhhlrbja0owgg6nbk0jw.png\"\/><\/figure>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 1 \u2014 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440.<br \/> \u041f\u043e\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 2, PostConstruct, \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u043b\u0430\u0441\u044c 6.<br \/> \u041f\u043e\u0442\u043e\u043c \u0438\u0434\u0435\u0442 \u0444\u0430\u0437\u0430 3, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0436\u0435 \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u043c.<br \/> \u0418\u0442\u043e\u0433\u0438 \u0442\u0440\u0435\u0445\u0444\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430<br \/> \u041f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u2014 Java, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 PostConstruct, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 BeanPostProcessor, \u0442\u0440\u0435\u0442\u0438\u0439 \u2014  AfterProxy, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 ContextListener.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qn\/-o\/vi\/qn-ovis_wbuwjvbcrsf1sdndhym.png\" data-src=\"https:\/\/habrastorage.org\/webt\/qn\/-o\/vi\/qn-ovis_wbuwjvbcrsf1sdndhym.png\"\/><\/figure>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>\u042d\u0442\u043e \u2014 \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u043e\u043a\u043b\u0430\u0434\u0430, \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0440\u044b\u0432\u0430 \u0431\u044b\u043b\u0430 \u0435\u0449\u0451 \u0438 <a href=\"https:\/\/www.youtube.com\/watch?v=cou_qomYLNU\">\u0432\u0442\u043e\u0440\u0430\u044f<\/a>. \u0415\u0441\u043b\u0438 \u043f\u043e \u0432\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0445\u0430\u0431\u0440\u0430\u043f\u043e\u0441\u0442 \u043f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0443\u0436\u0435\u043d \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<p>\u0410 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u043e\u0437\u043e\u0432\u0451\u043c \u0432\u0430\u0441 \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e <a href=\"https:\/\/jpoint.com\/?utm_source=habr&amp;utm_medium=893638\"><strong>JPoint 2025<\/strong><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u0442 \u0443\u0436\u0435 <strong>3\u20134 \u0430\u043f\u0440\u0435\u043b\u044f<\/strong> (\u041c\u043e\u0441\u043a\u0432\u0430 + \u043e\u043d\u043b\u0430\u0439\u043d). \u0422\u0430\u043c \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0434\u043b\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u2014 \u0438 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u0435\u0437 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0438 \u043d\u0430 \u0432\u043e\u0437\u0440\u0430\u0441\u0442 \u0434\u043e\u043a\u043b\u0430\u0434\u0430, \u0432\u0441\u0451 \u0441\u0432\u0435\u0436\u0435\u0435. \u0411\u0438\u043b\u0435\u0442\u044b \u0434\u0430\u0432\u043d\u043e \u0432 \u043f\u0440\u043e\u0434\u0430\u0436\u0435, \u0430 \u0441\u043f\u0438\u043a\u0435\u0440\u044b \u0443\u0436\u0435 \u043d\u0430 \u043d\u0438\u0437\u043a\u043e\u043c \u0441\u0442\u0430\u0440\u0442\u0435.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/893638\/\"> https:\/\/habr.com\/ru\/articles\/893638\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"\"><\/figure>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u043e\u043a\u043b\u0430\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u0442\u044c \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0432\u043e\u0441\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438. \u041d\u043e \u0441\u043e \u00abSpring-\u043f\u043e\u0442\u0440\u043e\u0448\u0438\u0442\u0435\u043b\u0435\u043c\u00bb \u0415\u0432\u0433\u0435\u043d\u0438\u044f \u0411\u043e\u0440\u0438\u0441\u043e\u0432\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u0438\u043d\u0430\u0447\u0435: \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u0435 \u0438 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0435\u0449\u0451 11 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434, \u0430 \u0435\u0451 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0441\u0442\u0443\u0442, \u0438 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0432\u0430\u043b\u0438\u043b\u0438 \u0437\u0430 \u0437\u0430 500 000. \u041f\u0435\u0440\u0435\u0434 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u043e\u0440\u043e\u0439 \u0448\u0442\u0443\u0434\u0438\u0440\u0443\u044e\u0442 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b: \u0441\u043e\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u0438 \u2014 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u043c\u0430\u0442\u0447\u0430\u0441\u0442\u044c, \u0440\u0430\u0431\u043e\u0442\u043e\u0434\u0430\u0442\u0435\u043b\u0438 \u2014 \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u0437\u0430\u043a\u043e\u0432\u044b\u0440\u0438\u0441\u0442\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0434\u043e\u043a\u043b\u0430\u0434 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0433\u043e Java-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430. \u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438, \u0447\u0442\u043e \u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0435\u0449\u0451 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0414\u0430, \u0447\u0442\u043e-\u0442\u043e \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e (\u0442\u0430\u043c \u0440\u0435\u0447\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u0435\u0449\u0451 \u043f\u0440\u043e Java 7), \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u0430\u0432\u043a\u0443 \u043d\u0430 \u0432\u043e\u0437\u0440\u0430\u0441\u0442. \u041d\u043e \u0440\u0430\u0437 \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u0442\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c Ctrl+F \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0410 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0445 Java-\u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432 \u2014 \u043c\u044b \u0442\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0432\u043e\u0432\u0441\u044e \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e <a href=\"https:\/\/jpoint.com\/?utm_source=habr&amp;utm_medium=893638\"><strong>JPoint 2025<\/strong><\/a> (\u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0443\u0436\u0435 3-4 \u0430\u043f\u0440\u0435\u043b\u044f).<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043e\u0442 \u043b\u0438\u0446\u0430 \u0441\u043f\u0438\u043a\u0435\u0440\u0430.<\/p>\n<hr\/>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/67e14f534c7c3ebada272a9a\" data-style=\"\" id=\"67e14f534c7c3ebada272a9a\" width=\"\"><\/div>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0440\u0435\u0431\u044f\u0442\u0430! \u042f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c Java \u0441 2001 \u0433\u043e\u0434\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u044f \u0443\u0448\u0435\u043b \u0432 \u00ab\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a\u0438\u00bb. \u0421\u0442\u0440\u0430\u0434\u0430\u044e \u043e\u0442 \u0430\u043b\u043b\u0435\u0440\u0433\u0438\u0438 \u043d\u0430 \u0432\u0435\u0441\u043d\u0443, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043b\u044e\u0431\u043b\u044e Spring. \u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u0434\u043e\u043a\u0441.<\/p>\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0441 \u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u043f\u0440\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435 Spring \u0438 \u0435\u0433\u043e \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0438\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442, \u0438 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u044f\u0442\u044b\u0439,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u0435\u0449\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a Spring \u0431\u044c\u0435\u0442 \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043a\u043b\u0430\u0434 \u00abSpring \u0432 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u0445\u00bb \u2014 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0442\u0443\u0442 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043a\u0438\u0448\u043a\u0438 Spring. \u0418\u0445 \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0442\u044c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 \u043c\u044b \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e \u0445\u043e\u0434\u0443 \u0434\u0435\u043b\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<h3>\u0421 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f<\/h3>\n<p>26 \u043d\u043e\u044f\u0431\u0440\u044f 2003 \u0433\u043e\u0434\u0430 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f <strong>XmlBeanDefinitionReader<\/strong> \u2014 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Spring, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0432\u0448\u0438\u0439 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 XML, \u0433\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0431\u0438\u043d\u044b. \u041e\u043d \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 XML \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u0442\u0430\u043c \u043f\u0438\u0448\u0435\u043c, \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442 \u0432 BeanDefinition (\u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0440\u043e \u0431\u0438\u043d\u044b).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0431\u0438\u043d \u0432 Spring. \u0423 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 Quoter \u2014 \u044d\u0442\u043e \u0446\u0438\u0442\u0430\u0442\u043d\u0438\u043a \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <code>sayQuote()<\/code><\/p>\n<pre><code class=\"java\">package quoters;  public interface Quoter {   void sayQuote(); } <\/code><\/pre>\n<p>\u0418 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u00abTerminatorQuoter\u00bb:<\/p>\n<pre><code class=\"java\">public class TerminatorQuoter implements Quoter {     private String message;      public void setMessage(String message) {         this.message = message;     }      @Override     public void sayQuote() {         System.out.println(\"message = \" + message);     } } <\/code><\/pre>\n<p>\u0423 \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438 \u2014 \u0441\u0442\u0440\u043e\u043a\u0430 message. \u0418 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0441\u0435\u0442\u0442\u0435\u0440: \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 XML \u044d\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u043b\u0435 \u0431\u0435\u0437 \u0441\u0435\u0442\u0442\u0435\u0440\u0430, \u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f XML-\u043d\u043e\u0433\u043e Spring \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438. \u041e\u043d \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0442\u0435\u0440 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0444\u043b\u0435\u043a\u0448\u0435\u043d, \u043d\u043e \u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0438 \u0432\u0441\u0451 \u0443\u043f\u0430\u0434\u0451\u0442. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>sayQuote()<\/code> \u043c\u044b \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0442\u0443 \u0446\u0438\u0442\u0430\u0442\u0443.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u043e\u0439\u0434\u0435\u043c \u0432 \u043d\u0430\u0448 XML-\u0444\u0430\u0439\u043b. \u0412 \u043d\u0451\u043c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0433 &lt;beans&gt;, \u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 \u0431\u0438\u043d\u044b.<\/p>\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8?&gt; &lt;beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"     xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"     xmlns:context=\"http:\/\/www.springframework.org\/schema\/context\"     xsi:schemaLocation=\"http:\/\/www.springframework.org\/schema\/beans\"&gt;   &lt;bean class = \"quoters.TerminatorQuoter\" id = \"terminatorQuoter\" &gt;  &lt;property name=\"message\" value=\"I'll be back\"\/&gt; &lt;\/bean&gt;   &lt;\/beans&gt; <\/code><\/pre>\n<p>\u0412\u043e\u0442 \u044f \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b \u0431\u0438\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u0430 <code>terminatorQuoter<\/code>, \u0434\u0430\u0434\u0438\u043c \u0435\u043c\u0443 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 id \u0438 \u043f\u0440\u043e\u043f\u0438\u0448\u0435\u043c property. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u0442\u0442\u0435\u0440, IDE \u0432 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0435 \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435 <code>message<\/code> \u0434\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 &#171;I&#8217;ll be back&#187;.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u044f \u0431\u0438\u043d\u0430 \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 Main (\u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e \u0438\u043d\u0430\u0447\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e). \u0410 \u0432 \u043d\u0451\u043c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 <code>ClassPathXmlApplicationContext<\/code>. \u0418\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 XmlBeanDefinitionReader, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438. \u042f \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 <code>context.xml<\/code>.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0438\u043d. \u0427\u0438\u0441\u0442\u043e \u0432 \u0442\u0435\u043e\u0440\u0438\u0438, \u0431\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443, \u0442\u0430\u043a \u0438 \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443. <strong>\u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u044b\u0442\u0430\u0449\u0443 \u043f\u043e \u043a\u043b\u0430\u0441\u0441\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c, \u043f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e<\/strong>.<\/p>\n<pre><code class=\"java\">public class Main {     public static void main(String[] args) {         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"context.xml\");         context.getBean(TerminatorQuoter.class).sayQuote();     } } <\/code><\/pre>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043c\u0435\u0442\u043e\u0434 <code>sayQuote()<\/code>, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u043f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0444\u0440\u0430\u0437\u0430 \u00abI&#8217;ll be back\u00bb, \u0432\u0441\u0451 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h3>\u041a\u0430\u043a \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h3>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440. \u041a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 2003 \u0433\u043e\u0434\u0443? (\u041f\u043e\u0442\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0435\u0449\u0435\u0439 \u043d\u0430\u043a\u0440\u0443\u0442\u0438\u043b\u043e\u0441\u044c, \u0434\u043e \u043d\u0438\u0445 \u0435\u0449\u0451 \u0434\u043e\u0439\u0434\u0451\u043c).<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443:<\/p>\n<figure class=\"\"><\/figure>\n<p>\u041c\u044b \u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448\u0438 \u043a\u043b\u0430\u0441\u0441\u044b. \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0433\u0440\u043e\u043a Spring \u2014 BeanFactory, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d-\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u0415\u0433\u043e \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u0432 \u0432\u0438\u0434\u0435 \u043f\u0447\u0435\u043b\u043a\u0438. \u0410 \u043d\u0430\u0448 \u0434\u0440\u0435\u0432\u043d\u0438\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 XML \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u0440\u0435\u0432\u043d\u0438\u0439 \u0441\u0432\u0438\u0442\u043e\u043a, \u043c\u044b \u0442\u0430\u043c \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0431\u0438\u043d \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u2014 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 BeanDefinitionReader, \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0438\u0437 XML \u0432\u0441\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u043e\u0432 \u0438 \u043a\u043b\u0430\u0434\u0435\u0442 \u0438\u0445 \u0432 map. \u0412 \u044d\u0442\u043e\u0439 map \u0443 \u043d\u0430\u0441 ID \u0431\u0438\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0433\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0445\u043e\u0434\u0438\u0442:<\/p>\n<ul>\n<li>\n<p>\u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0435\u0433\u043e init-\u043c\u0435\u0442\u043e\u0434 \u0438 \u043a\u0430\u043a \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f,<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u043f\u0435\u0440\u0442\u0438,<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0431\u0438\u043d\u0430, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 XML.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a BeanDefinitions \u0441\u043e\u0437\u0434\u0430\u043d\u044b, BeanFactory \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u043e \u043d\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c: \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0438 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0431\u0438\u043d\u044b \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u0422\u0443\u0442 \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0431\u0438\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u043e\u043c, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0410 \u0432\u0441\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u044b \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b. \u041a\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f \u2014 \u0442\u043e\u0433\u0434\u0430 Spring \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043b, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b, \u043e\u0442\u0434\u0430\u043b \u0438 \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e \u043d\u0435\u0433\u043e.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0435 destroy-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0431\u0438\u043d\u0430, \u0442\u043e \u0434\u043b\u044f \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u0430 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442, \u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u0430 \u2014 \u043d\u0435\u0442. \u041a\u043e\u0433\u0434\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, Spring \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0441\u0435\u043c \u0431\u0438\u043d\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f (\u0430 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b), \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0438\u0445 destroy-\u043c\u0435\u0442\u043e\u0434\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442. \u0410 \u043f\u0440\u043e\u0442\u043e\u0442\u0430\u0439\u043f\u044b Spring \u043d\u0438\u0433\u0434\u0435 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 destroy-\u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043d\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<h3>BeanPostProcessor<\/h3>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0432\u0435\u0449\u044c \u0432 \u043a\u0438\u0448\u043a\u0430\u0445 Spring \u2014 \u044d\u0442\u043e <strong>BeanPostProcessor<\/strong>. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0431\u0438\u043d\u044b \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u043f\u0430\u043b\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440. \u0415\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 chain of responsibility. \u041e\u043d \u0437\u0434\u0435\u0441\u044c \u043a\u0430\u043a \u0440\u0430\u0437 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d.<\/p>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u042f \u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0443 \u043a\u0430\u0441\u0442\u043e\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c Spring, \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f\u043c \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c BeanPostProcessor, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0432 \u0431\u0438\u043d\u0435 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438.<\/p>\n<p>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0435\u0431\u0435, \u0447\u0442\u043e \u044f \u043f\u0438\u0448\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0418 \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u043e\u043b\u044f. \u042f \u0432\u0438\u0436\u0443, \u0447\u0442\u043e \u0432 \u043c\u043e\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043b\u0430\u044e\u0442 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443: \u043a\u0442\u043e-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <code>Math.random()<\/code>, \u043a\u0442\u043e-\u0442\u043e <code>java.util.Random.nextInt()<\/code>, \u043a\u0442\u043e-\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0441\u043a\u0430\u0447\u0430\u043b.<\/p>\n<p>\u042f \u0433\u043e\u0432\u043e\u0440\u044e: \u00ab\u0422\u0430\u043a, \u044d\u0442\u043e \u043d\u0438\u043a\u0443\u0434\u0430 \u043d\u0435 \u0433\u043e\u0434\u0438\u0442\u0441\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e, \u043c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <a class=\"mention\" href=\"\/users\/InjectRandomInt\">@InjectRandomInt<\/a> \u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0451 \u043d\u0430\u0434 \u0442\u0435\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438, \u043a\u0443\u0434\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0436\u0435\u043a\u0442\u043d\u0443\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043c Spring \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u044d\u0442\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438\u00bb.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438. \u041f\u043e\u0439\u0434\u0435\u043c \u0432 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 TerminatorQuoter, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0430\u043c \u043f\u043e\u043b\u0435 <code>int<\/code> \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>repeat<\/code>: \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0434\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0446\u0438\u0442\u0430\u0442\u0443. \u0418 \u044f \u0445\u043e\u0447\u0443, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0437\u0430\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0435\u0439 InjectRandomInt, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0435\u043c. \u0423 \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, min \u0438 max (\u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u0430\u0434\u0438\u043c \u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 2 \u0438 7). \u0410 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>sayQuote()<\/code> \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0438\u043a\u043b \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<pre><code class=\"java\">public class TerminatorQuoter implements Quoter {      @InjectRandomInt(min = 2, max = 7)     private int repeat;      private String message;      public void setMessage(String message) {this.message = message;}      @Override     public void sayQuote() {         for (int i = 0; i &lt; repeat; i++) {             System.out.println(\"message = \" + message);     } } <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u043c\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e, IDEA \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u044e \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c retention policy \u043d\u0430 RUNTIME:<\/p>\n<pre><code class=\"java\">import \u2026  @Retention(RetentionPolicy.RUNTIME) public @interface InjectRandomInt {  \u2026 } <\/code><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0430\u043c \u0441\u0442\u043e\u0438\u0442 CLASS. \u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p><strong>SOURCE<\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0432\u0438\u0434\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445, \u0430 \u043a\u043e\u0433\u0434\u0430 \u0432\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0435, \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0435 \u0443\u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, overwrite \u2014 \u044d\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043b\u0430\u043d\u0430. \u041e\u043d\u0430 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>CLASS<\/strong> \u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f \u0432 \u0431\u0430\u0439\u0442\u043a\u043e\u0434 \u043f\u043e\u043f\u0430\u0441\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0447\u0435\u0440\u0435\u0437 reflection \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0432\u044b \u0435\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435, \u0435\u0435 \u0442\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0432\u0435\u0449\u0435\u0439 \u0432\u0440\u043e\u0434\u0435 AST-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0439 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>RUNTIME<\/strong> \u0441\u0442\u043e\u0438\u0442 \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0438\u0434\u043d\u044b \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435, \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 reflection. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u2014 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043f\u043e\u043c\u0435\u043d\u044f\u043b \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0430 RUNTIME, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435 \u043f\u0438\u0448\u0443 \u043e\u0431\u044b\u0447\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u0443\u0436\u0435 \u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u0443 \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0438\u0445 \u043c\u044b \u0442\u043e\u0436\u0435 \u043e\u0442\u043c\u0435\u0447\u0430\u0435\u043c.<\/p>\n<pre><code class=\"java\">import \u2026 @Retention(RetentionPolicy.RUNTIME) public @interface InjectRandomInt {  int min(); int max(); <\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0451 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u041d\u043e \u043a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0449\u0443 \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e, \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u00abInjectRandomInt\u00bb. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 repeat \u2014 \u044d\u0442\u043e \u043d\u043e\u043b\u044c, \u0438 \u0446\u0438\u0442\u0430\u0442\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u043b\u044c \u0440\u0430\u0437. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0443\u0447\u0430\u0442\u044c. \u041c\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432\u0441\u0435\u0445 \u0431\u0438\u043d\u043e\u0432, \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u043c\u0435\u044e\u0442 \u044d\u0442\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043f\u043e\u043b\u0435. \u041d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u00abInjectRandomIntAnnotationBeanPostProcessor\u00bb. \u041d\u0443, \u0432\u044b \u0432 \u043a\u0443\u0440\u0441\u0435, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 Spring \u043a\u043b\u0430\u0441\u0441 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 20 \u0431\u0443\u043a\u0432 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e! \u042f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0448\u0443\u0447\u0443, \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <a class=\"mention\" href=\"\/users\/Autowired\">@Autowired<\/a> \u0432 Spring \u0432\u043f\u043e\u043b\u043d\u0435 \u0435\u0441\u0442\u044c AutowiredAnnotationBeanPostProcessor, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u0442\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044e \u043a\u043e\u043d\u0432\u0435\u043d\u0446\u0438\u044e.<\/p>\n<p>\u042d<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-453210","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/453210","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=453210"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/453210\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=453210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=453210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=453210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}