[{"channel_id":1285566241,"post_id":4334,"date":1790748245000,"forwards":"2","views":"351","text":"<b>\u0422\u0440\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u0441\u043b\u043e\u0432\u0430 \u0432 Java \u2014 <\/b><code>final<\/code><b>, <\/b><code>finally<\/code><b>, <\/b><code>finalize<\/code><b> \u2014 \u043d\u043e \u0441\u043c\u044b\u0441\u043b \u0443 \u043d\u0438\u0445 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043d\u044b\u0439. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \ud83e\udde0<\/b><br><br><br>\ud83d\udd12 <code>final<\/code><br><br>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f <b>\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439<\/b>:<br><br>* <code>final class<\/code> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c.<br>* <code>final method<\/code> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c.<br>* <code>final variable<\/code> \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 (\u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b \u2014 \u0432\u0441\u0451).<br><br>\ud83d\udccc \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f <b>immutability<\/b> \u0438 <b>thread-safety<\/b>.<pre>final int x = 10;<br>x = 20; \/\/ \u043e\u0448\u0438\u0431\u043a\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/pre>\ud83e\uddef <code>finally<\/code><br><br>\u0411\u043b\u043e\u043a \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>try-catch-finally<\/code>. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f <b>\u0432\u0441\u0435\u0433\u0434\u0430<\/b>, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b\u043b <code>return<\/code> \u0438\u043b\u0438 <code>exception<\/code>.<br><br>\ud83d\udca1 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f <b>\u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/b>: \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u0438 \u0442.\u0434.<pre>try {<br>    \/\/ \u0447\u0442\u043e-\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<br>} catch (Exception e) {<br>    \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043a\u0438<br>} finally {<br>    \/\/ \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f<br>}<\/pre>\u26b0\ufe0f <code>finalize()<\/code><br><br>\u041c\u0435\u0442\u043e\u0434 \u0438\u0437 <code>Object<\/code>, \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0441\u044f <b>\u043f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u043c \u043c\u0443\u0441\u043e\u0440\u0430<\/b>.<br><br>\u26a0\ufe0f <b>\u0423\u0421\u0422\u0410\u0420\u0415\u041b<\/b> \u0441 Java 9, <b>\u0443\u0434\u0430\u043b\u0451\u043d<\/b> \u0432 Java 18. \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439.<br><br>\ud83d\udd2a \u041d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c, \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 GC. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u2014 <code>AutoCloseable<\/code> \u0438 <code>try-with-resources<\/code>.<pre>@Override<br>protected void finalize() throws Throwable {<br>    System.out.println(&quot;\u0414\u043e \u0441\u0432\u0438\u0434\u0430\u043d\u0438\u044f...&quot;);<br>}<\/pre>\ud83e\udde0 \u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c:<br><br>* <code>final<\/code> \u2014 \u043f\u0440\u043e <b>\u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0435\u043d\u044f\u0442\u044c<\/b><br>* <code>finally<\/code> \u2014 \u043f\u0440\u043e <b>\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f<\/b><br>* <code>finalize<\/code> \u2014 \u043f\u0440\u043e <b>\u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434<\/b><br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1235,"media":{"root":"\/003\/7hAAACEvoEwAAAAALJmk5WW6RSU","photo":{"thumbs":{"m":{"w":264,"h":320,"hash":"ku2VGJ6JHzfBtfrIawh0oQ&ts=1791167289"},"x":{"w":661,"h":800,"hash":"Cm8R81Kc97CfNbSsZsSEsg&ts=1791167289"},"y":{"w":1057,"h":1280,"hash":"SHp8qV9WFrWShVX-0ZQGXw&ts=1791167289"},"i":{"bytes":"AoACE|ChJI+9vmbr603zH\/vN+dD\/AH2+vpTMigB3mP8A3m\/OjzH\/ALzfnTaSgC9vb1NFNoqrFlZj87fWkzTnHzHp1puPpUkCZozRx7UfjQBaoptFa2LImT5jkHrTSnpn8qKKixIm1vQ0bW9DRRRYCxg+hooorosij\/\/Z"}}}}},{"channel_id":1285566241,"post_id":4333,"date":1790498268000,"forwards":"1","views":"97","text":"\ud83e\udde0 <b>\u041b\u0435\u043d\u0438\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 <\/b><code>Supplier<\/code><b> \u2014 \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 double-checked locking<\/b><br><br>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u044f\u0436\u0451\u043b\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u043c\u043d\u043e\u0433\u0438\u0435 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e\u0442 double-checked locking:<pre>private volatile SomeHeavyObject obj;<br><br>public SomeHeavyObject getObj() {<br>    if (obj == null) {<br>        synchronized (this) {<br>            if (obj == null) {<br>                obj = new SomeHeavyObject();<br>            }<br>        }<br>    }<br>    return obj;<br>}<\/pre>\u26a0\ufe0f \u041c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u0445\u0440\u0443\u043f\u043a\u043e, \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f. \u0415\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0435.<br><br>\ud83d\udccc <b>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <\/b><code>Supplier<\/code><b> \u0441 \u043b\u0435\u043d\u0438\u0432\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439:<\/b><pre>private final Supplier&lt;SomeHeavyObject&gt; lazyObj = Suppliers.memoize(SomeHeavyObject::new);<br><br>public SomeHeavyObject getObj() {<br>    return lazyObj.get();<br>}<\/pre>\ud83d\udca1 <code>Suppliers.memoize<\/code> \u2014 \u0438\u0437 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/github.com\/google\/guava\">Guava.<\/a> \u041e\u043d \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0443\u044e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0435 <code>get()<\/code>.<br><br>\u041f\u043b\u044e\u0441\u044b:<br>\u2014 \u0427\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443<br>\u2014 \u041f\u043e\u0442\u043e\u043a\u043e\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e<br>\u2014 \u041d\u0435\u0442 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430<br>\u2014 \u041b\u0435\u0433\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c<br><br>\ud83d\udd01 \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u0432 \u0447\u0438\u0441\u0442\u043e\u0439 Java: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>AtomicReference<\/code> \u0438 <code>updateAndGet<\/code>, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u043b\u0438\u043d\u043d\u0435\u0435 \u0438 \u043c\u0435\u043d\u0435\u0435 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e.<br><br>\u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0448\u044c Spring \u2014 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0431\u0438\u043d \u0432 <code>@Lazy<\/code>. \u041d\u043e \u0432\u043d\u0435 Spring, \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 Java-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0438\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0430\u0445 \u2014 <code>Supplier<\/code> \u0441 <code>memoize()<\/code> \u0438\u0434\u0435\u0430\u043b\u0435\u043d.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1247,"media":{"root":"\/00e\/7RAAACEvoEwAAAAAT602gVqs218","photo":{"thumbs":{"m":{"w":276,"h":320,"hash":"sksVdY4PW3BzPvqWL5QuZA&ts=1791167289"},"x":{"w":689,"h":800,"hash":"4g1hNoq08Jd4zWQ6Yu1O7g&ts=1791167289"},"y":{"w":1103,"h":1280,"hash":"8VwOpvoI_XDHy0WD5sky0w&ts=1791167289"},"i":{"bytes":"AoACM|CjJI5kb5z1Pemb3\/vt+dI5\/eNkdzSHFADvMb++fzo8xv75\/Oo6KALsMj+UPmP50UyH\/VCinYoiYZdvrTMAdaVhlz9aaeO1IkXik49aSigCzF\/qxRTY\/uCirsMaw+Y5B6+lNx7H8qKKVgDHsfypCD6H8qKKLATRg7BwaKKK15UM\/9k="}}}}},{"channel_id":1285566241,"post_id":4332,"date":1790140681000,"forwards":"1","views":"93","text":"<b>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c try-with-resources?<\/b><br><br>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c <code>try-with-resources<\/code> \u0432 Java \u2014 \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u043a\u0435\u0442\u044b, \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0411\u0414 \u0438 \u0442.\u0434.). \u041e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0430 <code>try<\/code>, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u044f \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0438\u0441\u0430\u0442\u044c <code>finally<\/code> \u0432\u0440\u0443\u0447\u043d\u0443\u044e.<br><br>\ud83d\udccc <b>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 Java 7<\/b><br>\ud83d\udccc <b>\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <\/b><code>AutoCloseable<\/code><br><br> \ud83d\udca1 \u041f\u0440\u0438\u043c\u0435\u0440:<pre>try (BufferedReader reader = new BufferedReader(new FileReader(&quot;file.txt&quot;))) {<br>    String line = reader.readLine();<br>    System.out.println(line);<br>} catch (IOException e) {<br>    e.printStackTrace();<br>}<br>\/\/ reader \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/pre>\ud83e\udde0 \u041f\u043e\u0447\u0435\u043c\u0443 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e:<br><br>* \u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 boilerplate-\u043a\u043e\u0434<br>* \u0418\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0443\u0442\u0435\u0447\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<br>* \u0423\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439<br><br> \u26a0\ufe0f \u0421\u043e\u0432\u0435\u0442:<br><br>\u0421 Java 9 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 final \u0438\u043b\u0438 effectively final:<pre>BufferedReader reader = new BufferedReader(new FileReader(&quot;file.txt&quot;));<br>try (reader) {<br>    System.out.println(reader.readLine());<br>}<\/pre>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1063,"media":{"root":"\/00d\/7BAAACEvoEwAAAAAX87pU25dLsA","photo":{"thumbs":{"m":{"w":320,"h":294,"hash":"r-7Q6Z8WWMNnN6niJ9yc5g&ts=1791167289"},"x":{"w":800,"h":734,"hash":"PnyPNvvo7hRvtnXc_TBlTQ&ts=1791167289"},"y":{"w":1280,"h":1175,"hash":"lPuSAT0gSTG3HdQCyQ_53w&ts=1791167289"},"i":{"bytes":"AlACg|ClJJIZG+dup6Gmb5P77fnQ5\/eP9TTcn0P50AO3y\/3m\/Ok3y\/3j+dN\/P86TmgCSOV\/MX5z1HeimR\/6xfqKKpDQ98+Y2PU0xs980987mx6mmHJ4JFSISkpdvuKMe4oAWP\/WL9aKE++vPeiqiUiZ4fnb5u\/pTfJP9\/wDSiinZCDyP9r9KTyf9r9KKKdkAJF8689\/SiiirilYaP\/\/Z"}}}}},{"channel_id":1285566241,"post_id":4331,"date":1789971470000,"forwards":"9","views":"390","comments":"2","text":"\ud83d\udccc <b>picocli<\/b> \u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f CLI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Java. \u041e\u043d\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f:<br><br>* \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e <code>--help<\/code> \u0438 <code>--version<\/code><br>* \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434 (\u043a\u0430\u043a \u0432 <code>git commit<\/code>, <code>git push<\/code>)<br>* \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043e\u043f\u0446\u0438\u0438 \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u043c\u0438 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 (<code>-v<\/code>, <code>--verbose<\/code>)<br>* \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 GraalVM (\u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438)<br>* \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 (\u0430\u043d\u043d\u043e\u0442\u0438\u0440\u0443\u0439 POJO \u2014 \u0438 \u0433\u043e\u0442\u043e\u0432\u043e!)<br>* \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<br>* \u0426\u0432\u0435\u0442\u043d\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0433\u0438\u0431\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<br>* \u0418\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0438 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<br><br>\u041f\u0440\u043e\u0435\u043a\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u0442\u043d\u044f\u0445 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0442\u044b \u0438\u0449\u0435\u0448\u044c \u043c\u043e\u0449\u043d\u0443\u044e \u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 CLI-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 Java \u2014 picocli \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440.<br><br><a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/github.com\/remkop\/picocli\">https:\/\/github.com\/remkop\/picocli<\/a><br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":791,"media":{"root":"\/00d\/6xAAACEvoEwAAAAAX87pU25dLsA","photo":{"thumbs":{"m":{"w":320,"h":302,"hash":"1AlIwIjZbvscGV2DfhguvA&ts=1791167289"},"x":{"w":694,"h":654,"hash":"cWomFLnngI5efSVGIYpbCQ&ts=1791167289"},"i":{"bytes":"AmACg|DHz7mlz7mlzno350oDHuPzNADCT6mk3H1NPIOMH+tJt9v50ANJz1ooII60UAPXoTSo2c0EDscfjSAAdG\/WgBWAP\/1hQQAOSP0pMD+8fzowD\/H+ZoARiP8AIoppGO+aKAHbh70bh70UUAG760mR70UUAIcZ4ooooA\/\/2Q=="}}}}},{"channel_id":1285566241,"post_id":4330,"date":1789708981000,"forwards":"4","views":"198","text":"Double-brace \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 Java \u2014 \u044d\u0442\u043e \u0438\u0434\u0438\u043e\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 (\u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u0432 \u043a\u0440\u0430\u0442\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0435. \u041e\u043d\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0434\u0432\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 \u043f\u043e\u0434\u0440\u044f\u0434 <code>{{<\/code> \u0438 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435. \u041f\u0440\u0438\u043c\u0435\u0440:<pre>import java.util.*;<br><br>List&lt;String&gt; list = new ArrayList&lt;String&gt;() {{<br>    add(&quot;one&quot;);<br>    add(&quot;two&quot;);<br>    add(&quot;three&quot;);<br>}};<\/pre>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<br><br>Double-brace \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0434\u0432\u0443\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439:<br><br>1. <b>\u0410\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441<\/b>:<pre>new ArrayList&lt;String&gt;() { ... }<\/pre>\u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0431\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u0430\u0441\u0441 <code>ArrayList<\/code>.<br><br>2. <b>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430<\/b>:<pre>{{ ... }}<\/pre>\u042d\u0442\u043e \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0412 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u0432 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>add()<\/code>).<br><br>\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430:<br><br>* \u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439.<br>* \u041c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u043e\u043b\u044f\u0445 <code>final<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<pre>private static final Set&lt;String&gt; set = new HashSet&lt;&gt;() {{<br>      add(&quot;A&quot;);<br>      add(&quot;B&quot;);<br>  }};<\/pre>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438:<br><br>1. <b>\u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0439 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441<\/b> \u2014 \u044d\u0442\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430 \u0438 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br>2. <b>\u0423\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/b> \u2014 \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u044f\u0432\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u0435\u0433\u043e.<br>3. <b>\u0427\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u044c<\/b> \u2014 \u043d\u0435 \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u043d\u0430\u044e\u0442, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0431\u0438\u0432\u0430\u0442\u044c \u0441 \u0442\u043e\u043b\u043a\u0443.<br>4. <b>\u041d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 OOP<\/b> \u2014 \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u044f\u0432\u043d\u043e \u0432\u0438\u0434\u0435\u043d.<br><br>\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b:<br><br>Java 8+ (\u0447\u0435\u0440\u0435\u0437 <code>Stream<\/code> \u0438 <code>Collectors<\/code>):<pre>List&lt;String&gt; list = Stream.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;)<br>                          .collect(Collectors.toList());<\/pre>\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:<pre>public static List&lt;String&gt; createList() {<br>    List&lt;String&gt; list = new ArrayList&lt;&gt;();<br>    list.add(&quot;one&quot;);<br>    list.add(&quot;two&quot;);<br>    return list;<br>}<\/pre>Java 9+ (immutable):<pre>List&lt;String&gt; list = List.of(&quot;one&quot;, &quot;two&quot;, &quot;three&quot;);<br>Set&lt;String&gt; set = Set.of(&quot;A&quot;, &quot;B&quot;);<\/pre>\u0412\u044b\u0432\u043e\u0434:<br><br>Double-brace \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u044d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439, \u043d\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0442\u0440\u044e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0435. \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0435 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043d\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 Java 8+.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":2116,"media":{"root":"\/001\/6hAAACEvoEwAAAAAgqcUNeDg5rI","photo":{"thumbs":{"m":{"w":157,"h":320,"hash":"0Ia0Eu8ZTyuZ6NFd4pwlkw&ts=1791167289"},"x":{"w":392,"h":800,"hash":"bshkamnvuyFvW00QE15e4g&ts=1791167289"},"y":{"w":627,"h":1280,"hash":"hYooM5fLBTCehJ8Qcb2NnA&ts=1791167289"},"i":{"bytes":"AoABQ|DPeQ7j16+tN8w+\/wCdDgZP1ptAE8LttPJ6+tFNi+7+NFOwxjZyeBTefQU49TzSEn1pCHpkLRSIeKKpIYjDk0mP84oopWAcoOKKKK0SA\/\/Z"}}}}},{"channel_id":1285566241,"post_id":4329,"date":1789539330000,"forwards":"1","views":"100","text":"\ud83e\udde0<code>@Value<\/code><b> vs <\/b><code>@ConfigurationProperties <\/code><b>\u2014 \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0439 \u043d\u0430\u043e\u0431\u0443\u043c<\/b><br><br>\u041e\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0445\u043e\u0440\u043e\u0448\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0438\u0445 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u0418 \u0435\u0441\u043b\u0438 \u0442\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u0432\u0435\u0437\u0434\u0435 \u043f\u0438\u0445\u0430\u0435\u0448\u044c <code>@Value<\/code>, \u0434\u0435\u0440\u0436\u0438 \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u0433\u0430\u0439\u0434, \u043a\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0447\u0442\u043e:<br><br><br>\ud83d\udccc <code>@Value<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e, \u043d\u043e \u043d\u0435 \u0433\u0438\u0431\u043a\u043e:<pre>@Value(&quot;${my.prop}&quot;)<br>private String value;<\/pre>\u2705 \u0425\u043e\u0440\u043e\u0448\u043e \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<br>\u274c \u041f\u043b\u043e\u0445\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438<br>\u274c \u0422\u0440\u0443\u0434\u043d\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438 (\u0431\u0435\u0437 <code>TestPropertySource<\/code>)<br>\u274c \u041d\u0435\u0442 \u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0430 \u043f\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0443 \u2192 \u043d\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0438<br><br><br><br>\ud83d\udccc<code> @ConfigurationProperties<\/code> \u2014 \u0441\u0438\u043b\u0430 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431:<pre>@ConfigurationProperties(prefix = &quot;app.feature&quot;)<br>public class FeatureProperties {<br>    private boolean enabled;<br>    private List&lt;String&gt; items;<br>}<\/pre>\ud83d\udca1 \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0441 <code>@EnableConfigurationProperties<\/code> \u0438\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0438\u0440\u0443\u0439 \u043a\u0430\u043a <code>@Component<\/code><br><br>\u2705 \u0423\u0434\u043e\u0431\u043d\u043e \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<br>\u2705 \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438<br>\u2705 \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 JSR-303 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e (<code>@Validated<\/code>)<br>\u2705 \u041b\u0435\u0433\u0447\u0435 \u043c\u043e\u043a\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445<br>\u2705 \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Spring Boot Actuator (<code>\/actuator\/configprops<\/code>)<br><br><br>\u26a0\ufe0f <b>\u041d\u0435 \u0441\u043c\u0435\u0448\u0438\u0432\u0430\u0439<\/b>: \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0442\u044f\u043d\u0443\u0442\u044c <code>@Value<\/code> \u0432\u043d\u0443\u0442\u0440\u044c <code>@ConfigurationProperties<\/code> \u2014 \u044d\u0442\u043e \u0430\u043d\u0442\u0438\u043f\u0430\u0442\u0442\u0435\u0440\u043d.<br><br><br>\u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 <code>@Value<\/code> \u043d\u043e\u0440\u043c. \u041d\u043e \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438, \u043b\u043e\u0433\u0438\u043a\u0430 \u2014 <b>\u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 <\/b><code>@ConfigurationProperties<\/code>.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1211,"media":{"root":"\/002\/6RAAACEvoEwAAAAAzBFCBR1pwcs","photo":{"thumbs":{"m":{"w":290,"h":320,"hash":"9rAror1gyijBi-sEd-UveQ&ts=1791167289"},"x":{"w":724,"h":800,"hash":"6e-yKf8ko8zXw_Emv3kH5g&ts=1791167289"},"y":{"w":1159,"h":1280,"hash":"cHKjJux1OPFlRxfFqQvsqA&ts=1791167289"},"i":{"bytes":"AoACQ|CjLLJ5jfvCOT3pvmP\/AM9D\/wB9USD943TqaaVoAd5j\/wB8\/nSea\/8AfP50wjFJQBctpGMZyx6+tFNtv9WfrRTKRC+PMbPqaacDpT5Mb2+tNyKRIyinH2ptAFm2\/wBWfrRRb\/cP1oq0iiNwd7fK3Wm7T\/db8qKKVhBg+jflSYPoaKKOULE0IO08HrRRRWqirDP\/2Q=="}}}}},{"channel_id":1285566241,"post_id":4328,"date":1789370991000,"forwards":"7","views":"123","text":"\ud83e\udde0 <b>\u0422\u0440\u044e\u043a \u0441 <\/b><code>@EventListener<\/code><b> \u0432 Spring \u2014 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u0438\u0448\u043d\u0438\u0439 <\/b><code>@TransactionalEventListener<\/code><br><br>\u041a\u043e\u0433\u0434\u0430 \u0442\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f <b>\u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/b>, \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u043c:<pre>@TransactionalEventListener<br>public void handleEvent(MyEvent event) {<br>    \/\/ ...<br>}<\/pre>\u26a0\ufe0f \u041d\u043e \u0435\u0441\u0442\u044c \u043d\u044e\u0430\u043d\u0441: <code>@TransactionalEventListener<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <b>\u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430<\/b>. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043d\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0433\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u0448\u044c, \u0447\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0441\u044f <i>\u0432\u043d\u0443\u0442\u0440\u0438<\/i> \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438.<br><br>\ud83d\udccc \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430: \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>@EventListener<\/code>, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 <code>TransactionSynchronizationManager<\/code>.<br><br>\ud83d\udca1 \u0421\u043d\u0438\u043f\u043f\u0435\u0442:<pre>@Component<br>public class MyEventHandler {<br><br>    @EventListener<br>    public void handle(MyEvent event) {<br>        if (TransactionSynchronizationManager.isActualTransactionActive()) {<br>            TransactionSynchronizationManager.registerSynchronization(<br>                new TransactionSynchronizationAdapter() {<br>                    @Override<br>                    public void afterCommit() {<br>                        \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430<br>                    }<br>                }<br>            );<br>        } else {<br>            \/\/ fallback: \u043d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0440\u0430\u0437\u0443<br>        }<br>    }<br>}<\/pre>\ud83d\udcce \u041f\u043b\u044e\u0441\u044b:<br>\u2014 \u041b\u0443\u0447\u0448\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c: \u0442\u044b \u0441\u0430\u043c \u0440\u0435\u0448\u0430\u0435\u0448\u044c, <b>\u043a\u043e\u0433\u0434\u0430<\/b> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c (\u0434\u043e\/\u043f\u043e\u0441\u043b\u0435\/\u0432\u043d\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438)<br>\u2014 \u041c\u043e\u0436\u043d\u043e \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 utility-\u043c\u0435\u0442\u043e\u0434<br>\u2014 \u0413\u0438\u0431\u043a\u043e\u0441\u0442\u044c: \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0439 Spring&#039;\u0430<br><br>\u26a0\ufe0f \u041c\u0438\u043d\u0443\u0441: \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u043e\u0434\u0430, \u043d\u043e <b>\u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/b>.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1423,"media":{"root":"\/011\/6BAAACEvoEwAAAAARQZFZigcWN8","photo":{"thumbs":{"m":{"w":266,"h":320,"hash":"pbnZku-NsUSQCLfTsV4_sQ&ts=1791167289"},"x":{"w":666,"h":800,"hash":"Pioquhzd_RlBM8DWJokXlg&ts=1791167289"},"y":{"w":1065,"h":1280,"hash":"JWyMLXKLN-sURpwxivVi_Q&ts=1791167289"},"i":{"bytes":"AoACE|CjJI5kb5z1Pemb3\/vn86HxvbI7mm\/L7UAO8xv75\/OkMj\/3z+dJx6Ck49qAL29v7xoplFVYsrsfnYH1pCo96R\/vt9aT8TUkBgev6UGj8aSgC3RSUVtYshcHceD19KT\/AID+lFFZ2JEOf7v6UmD6fpRRRYCxg+hoooro5UUf\/9k="}}}}},{"channel_id":1285566241,"post_id":4326,"date":1789025845000,"forwards":"3","views":"144","text":"<img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5301179216061015693\/thumb.webp?hash=vgl9HLnFPvoMqhs6Gk3VFg&ts=1791167289' alt='\ud83d\udc69\u200d\ud83d\udcbb'> <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/otus.ru\/lessons\/java-professional#event-7424\"><b>HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u0439 Java \u0437\u0430 30 \u043c\u0438\u043d\u0443\u0442<\/b><\/a><br><br>\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0443\u0440\u043e\u043a.<br><br>\ud83d\uddd3 21 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u0432 20:00 \u041c\u0421\u041a<br>\ud83c\udd93 \u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. \u0423\u0440\u043e\u043a \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0441\u0442\u0430\u0440\u0442\u0430 \u043a\u0443\u0440\u0441\u0430 <u>\u00abJava \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c\u00bb.<\/u><br><br><i>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c, \u043a\u0430\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c, \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 HTTP-\u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u0435\u0437 Spring \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a.<\/i><br><br><u>\u041e \u0447\u0435\u043c \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c:<\/u><br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5323409167921200728\/thumb.webp?hash=gIyrJx94bO_qyteuIWZn6w&ts=1791167289' alt='\u2714\ufe0f'> \u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d HTTP-\u0437\u0430\u043f\u0440\u043e\u0441<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5323409167921200728\/thumb.webp?hash=gIyrJx94bO_qyteuIWZn6w&ts=1791167289' alt='\u2714\ufe0f'>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 Java<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5323409167921200728\/thumb.webp?hash=gIyrJx94bO_qyteuIWZn6w&ts=1791167289' alt='\u2714\ufe0f'> \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0434\u0440\u0435\u0441\u043e\u0432<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5323409167921200728\/thumb.webp?hash=gIyrJx94bO_qyteuIWZn6w&ts=1791167289' alt='\u2714\ufe0f'> \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5323409167921200728\/thumb.webp?hash=gIyrJx94bO_qyteuIWZn6w&ts=1791167289' alt='\u2714\ufe0f'> \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c, \u0447\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442 Spring<br><br>\ud83d\udd17 <b>\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e<\/b>: <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/vk.cc\/d1sLwn\">https:\/\/vk.cc\/d1sLwn<\/a><br><br>\u0420\u0435\u043a\u043b\u0430\u043c\u0430. \u041e\u041e\u041e \u00ab\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u00bb, \u041e\u0413\u0420\u041d 1177746618576","text_length":571,"media":{"root":"\/006\/5hAAACEvoEwAAAAAnGykLQHSnB8","photo":{"thumbs":{"m":{"w":320,"h":320,"hash":"46fbQ5BB0DHLKJrZB99-xQ&ts=1791167289"},"x":{"w":800,"h":800,"hash":"2preOHe1XKZhiHn3-C6nRw&ts=1791167289"},"y":{"w":1080,"h":1080,"hash":"G_J3VEo1RrshSH96JKVixQ&ts=1791167289"},"i":{"bytes":"AoACg|DTKNnIkI\/AU8kAZNLVedCzqN+0Y5poCYvgZPSgMD0NVrh\/LiVFHBp9v8mQWznoaV1sOztcnooyKKBDsVDJAXOd1SM5B2hG+uOKYXfOPm\/74oAgltpJAAX5HfFLHbOpB3EkVPuYDnJPstJuf\/a\/74pWHceFNFCscgEMffFFMQ+kOccdaKKT2Ar+W27d5abuucmrAJxz1ooqYrUYtFFFWI\/\/2Q=="}}}}},{"channel_id":1285566241,"post_id":4325,"date":1789022212000,"forwards":"2","views":"88","comments":"1","text":"\ud83e\udde0 \u041a\u0430\u043a \u043d\u0435 \u0441\u043b\u043e\u0432\u0438\u0442\u044c <code>LazyInitializationException<\/code> \u0432 Spring Boot + Hibernate<br><br>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 JPA:<pre>org.hibernate.LazyInitializationException: failed to lazily initialize a collection<\/pre>\ud83d\udccc \u041f\u0440\u0438\u0447\u0438\u043d\u0430: \u043b\u0435\u043d\u0438\u0432\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u0430\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f (<code>LAZY<\/code>) \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0411\u0414 <b>\u0432\u043d\u0435 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<\/b> \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0441\u043b\u043e\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f <code>Session<\/code>.<br><br>\ud83d\udca1 \u041a\u0430\u043a \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c?<br><br>\u2705 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 1: <code>@Transactional<\/code> \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435<br><br>\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0432\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0435\u0441\u044c \u043a \u043b\u0435\u043d\u0438\u0432\u044b\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c <b>\u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0441 <\/b><code>@Transactional<\/code>:<pre>@Transactional<br>public UserDto getUser(Long id) {<br>    User user = userRepository.findById(id)<br>        .orElseThrow();<br><br>    \/\/ OK: \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f friends \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438<br>    return new UserDto(user.getName(), user.getFriends());<br>}<\/pre>\u26a0\ufe0f \u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>@Transactional<\/code> \u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 - \u044d\u0442\u043e \u043f\u043b\u043e\u0445\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430.<br><br><br><br>\u2705 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 2: Fetch Join<br><br>\u041f\u043e\u0434\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0440\u0430\u0437\u0443 \u0447\u0435\u0440\u0435\u0437 <code>JOIN FETCH<\/code>:<pre>@Query(&quot;SELECT u FROM User u LEFT JOIN FETCH u.friends WHERE u.id = :id&quot;)<br>Optional&lt;User&gt; findByIdWithFriends(@Param(&quot;id&quot;) Long id);<\/pre>\ud83d\udccc \u041f\u043b\u044e\u0441: 1 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u043c\u0435\u0441\u0442\u043e N (N+1 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f).<br>\ud83d\udccc \u041c\u0438\u043d\u0443\u0441: \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u0430\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044f\u043c\u0438.<br><br><br><br>\u2705 \u0420\u0435\u0448\u0435\u043d\u0438\u0435 3: DTO \u043f\u0440\u043e\u0435\u043a\u0446\u0438\u044f<br><br>\u041b\u0443\u0447\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 - \u043f\u0440\u043e\u0435\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 DTO:<pre>@Query(&quot;&quot;&quot;<br>    SELECT new com.example.UserDto(u.name, f.name)<br>    FROM User u<br>    LEFT JOIN u.friends f<br>    WHERE u.id = :id<br>&quot;&quot;&quot;)<br>List&lt;UserDto&gt; findUserWithFriendNames(@Param(&quot;id&quot;) Long id);<\/pre>\ud83d\udccc \u0412\u044b\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u0411\u044b\u0441\u0442\u0440\u043e, \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e.<br><br><br>\u041b\u0435\u043d\u0438\u0432\u0430\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f - \u043e\u043a, <b>\u0435\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439<\/b>.<br>\u041f\u0440\u043e\u0435\u043a\u0446\u0438\u0438 \u0438 <code>fetch join<\/code> - \u0432\u0430\u0448\u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0434\u0440\u0443\u0437\u044c\u044f, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1683,"media":{"root":"\/012\/5RAAACEvoEwAAAAAL-GsHr5PP2o","photo":{"thumbs":{"m":{"w":217,"h":320,"hash":"L-q98IcTzJR93pY7JdB3LA&ts=1791167289"},"x":{"w":542,"h":800,"hash":"hezq_4EQfaGrSMLpuFByKg&ts=1791167289"},"y":{"w":868,"h":1280,"hash":"ZhA8OzSukt4PtWMDWWn8PA&ts=1791167289"},"i":{"bytes":"AoABs|Cg7vvb5z19aTc\/98\/nSPguevWm49jQA7e\/98\/nViF38sfMaqcehqxF\/qxQhohcHefrTcGnt94896bz60CEqaP7gqHNTR\/cFNDQxgcn\/Ckx7fpRRTsAhH+cVKgOwcUUVSQH\/9k="}}}}},{"channel_id":1285566241,"post_id":4322,"date":1788928823000,"forwards":"2","views":"109","text":"\ud83d\udccc<b> Java Collections<\/b><br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":45,"grouped_id":14311430586629674,"media":{"gallery":[{"root":"\/013\/4hAAACEvoEwAAAAAL5kiwNmkv3M","photo":{"thumbs":{"m":{"w":320,"h":257,"hash":"IRSMdNLkpyqQDHXl4Jb8Bg&ts=1791167289"},"x":{"w":800,"h":642,"hash":"S4rAcaT1kA78PwzBtqxJhw&ts=1791167289"},"y":{"w":1078,"h":865,"hash":"tdgXwoCU8LXt18AeQPAMqg&ts=1791167289"},"i":{"bytes":"AgACg|DYAx6\/nTZSPLbJIHqOtNkSRmysu0Y6Yo2MIiN+Wx97FMRFCVMgxJIT6HpVhxlcZI+lQLlX+abOOo29ac6SFiVl2j0xRdNiSaWxKnTofxopkbgAKX3N64xmipuih0gyPulvYUwKfLYINjEdTzUknT+L8KbGMgj5h9aXUfQZHHOHBeUMvptqbuaaqBTnJ\/E1C8QZySZefQ1V+5NrbEoWTPLjH0op44A\/rRSshn\/\/2Q=="}}}},{"root":"\/002\/4xAAACEvoEwAAAAAzBFCBR1pwcs","photo":{"thumbs":{"m":{"w":178,"h":320,"hash":"y4_4VnyTPyIPVRYC6A15sw&ts=1791167289"},"x":{"w":444,"h":800,"hash":"05LHnExnTkQQ6swEg5HR4g&ts=1791167289"},"y":{"w":710,"h":1280,"hash":"tqFxly49THONKLO4pyLLuA&ts=1791167289"},"i":{"bytes":"AoABY|DWbGe2frSA+hH50rdQaQg\/5zQA9c96KF6Y5ooARv8APFJuPb+VK\/4Gk5\/vAUAOBPcUUL\/vZooARgT6\/hTSD6t+dFFAEg6UUUUAf\/\/Z"}}}},{"root":"\/011\/5BAAACEvoEwAAAAARQZFZigcWN8","photo":{"thumbs":{"m":{"w":193,"h":320,"hash":"VnJns2PKa9oocqA0Z7zboQ&ts=1791167289"},"x":{"w":482,"h":800,"hash":"uAEMBszExD-VAAkkZO6BBA&ts=1791167289"},"y":{"w":772,"h":1280,"hash":"44qBoFqUfdibaF_0N9HcXA&ts=1791167289"},"i":{"bytes":"AoABg|C8IYO4H5mjyLb+6Pzqb+E0nYetTYq5EILb+6v50VNxuxmiiwXDA2MaMghelA4U9aDztpki\/wAfaij+Pjp9KKAHKuOpBFBHIxiiimA3+M9fwooooA\/\/2Q=="}}}}]}},{"channel_id":1285566241,"post_id":4321,"date":1788499561000,"forwards":"3","views":"282","text":"\ud83e\udde0 <b>Spring Boot: \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 <\/b><code>ObjectProvider<\/code><br><br>\u0418\u043d\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <b>\u043d\u0435 \u043d\u0443\u0436\u043d\u043e<\/b> \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0436\u0435\u043a\u0442\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u0443\u044e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u2014 \u0442\u043e\u043b\u044c\u043a\u043e <i>\u0438\u043d\u043e\u0433\u0434\u0430<\/i> \u043f\u043e \u0445\u043e\u0434\u0443 \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u043e <code>@Autowired<\/code> \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0442\u044f\u043d\u0435\u0442 \u0435\u0451 \u0441\u0440\u0430\u0437\u0443, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0432\u0430\u043c \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u042d\u0442\u043e \u0431\u044c\u0451\u0442 \u043f\u043e <b>\u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u0440\u0442\u0430<\/b> \u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c <b>\u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/b>.<br><br>\ud83d\udca1 \u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>ObjectProvider&lt;T&gt;<\/code>.<br><br>\u041f\u0440\u0438\u043c\u0435\u0440:<pre>@Service<br>public class NotificationService {<br><br>    private final ObjectProvider&lt;EmailSender&gt; emailSenderProvider;<br><br>    public NotificationService(ObjectProvider&lt;EmailSender&gt; emailSenderProvider) {<br>        this.emailSenderProvider = emailSenderProvider;<br>    }<br><br>    public void sendEmailIfEnabled(String to, String body) {<br>        if (featureEnabled()) {<br>            EmailSender sender = emailSenderProvider.getIfAvailable();<br>            if (sender != null) {<br>                sender.send(to, body);<br>            }<br>        }<br>    }<br>}<\/pre>\ud83d\udccc <code>ObjectProvider<\/code>:<br><br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'>\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0431\u0438\u043d \u0441\u0440\u0430\u0437\u0443 \u2014 \u043b\u0435\u043d\u0438\u0432\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f;<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u0438\u043d\u0430 (<code>getIfAvailable()<\/code> \/ <code>ifAvailable(...)<\/code>);<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'>\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>stream()<\/code> \u2014 \u0434\u043b\u044f \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0431\u0438\u043d\u043e\u0432.<br><br>\u26a0\ufe0f \u042d\u0442\u043e <b>\u043d\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430<\/b> DI. \u042d\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 <b>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/b> \u0431\u0438\u043d\u043e\u0432 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e.<br><br>\ud83d\udcc8 \u041e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442:<br><br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'>\u043f\u0440\u0438 \u0431\u043e\u0440\u044c\u0431\u0435 \u0441 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438;<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'>\u0434\u043b\u044f optional-\u0431\u0438\u043d\u043e\u0432;<br><img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5208848079305850446\/thumb.webp?hash=CuucsgjIGMoNEpzdgcGIaQ&ts=1791167289' alt='\u25ab\ufe0f'>\u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0440\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1349,"media":{"root":"\/012\/4RAAACEvoEwAAAAAL-GsHr5PP2o","photo":{"thumbs":{"m":{"w":253,"h":320,"hash":"VVnhf26rCavOEJUVE8b-GA&ts=1791167289"},"x":{"w":632,"h":800,"hash":"em-hM0GqS7qZlyOifMI25g&ts=1791167289"},"y":{"w":1012,"h":1280,"hash":"GzGvI-GxMWyZLwHwzCasYA&ts=1791167289"},"i":{"bytes":"AoACA|CjJI5kb5z1Pemb3\/vn86H5duvU03B9TQA7e\/8AfP50qO+9fnPUd6j20qDDr9aAFYjzGz6mkJFOYAs31pNo96AG5FKv3x9aCMd6F++PrQA9x8xyp6+lMx7H8qKKqwxMH0NKoO4cHrRRTSA\/\/9k="}}}}},{"channel_id":1285566241,"post_id":4320,"date":1788415570000,"forwards":"3","views":"186","text":"\ud83d\udca1 <b>\u0427\u0435\u043c \u043e\u043f\u0430\u0441\u0435\u043d <\/b><code>@Scheduled(fixedRate)<\/code><b> \u0431\u0435\u0437 <\/b><code>@Transactional<\/code><b>?<\/b><br><br>\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 Spring \u0447\u0435\u0440\u0435\u0437 <code>@Scheduled<\/code> \u2014 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443. \u041d\u043e \u0447\u0430\u0441\u0442\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u0431\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441 <code>fixedRate<\/code>, \u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u043b\u043e\u0432\u0443\u0448\u043a\u0443.<br><br>\ud83d\udccc \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<pre>@Scheduled(fixedRate = 10_000)<br>public void cleanUp() {<br>    List&lt;Job&gt; jobs = jobRepository.findAllByStatus(PENDING);<br>    jobs.forEach(job -&gt; {<br>        job.setStatus(PROCESSING);<br>        jobRepository.save(job);<br>    });<br>}<\/pre>\ud83e\udde8 \u041a\u0430\u0436\u0434\u044b\u0435 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u043c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u0415\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0435\u0449\u0451 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u043e, \u043d\u0430\u0447\u043d\u0451\u0442\u0441\u044f <b>\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0442\u043e\u043a<\/b>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0431\u0435\u0440\u0451\u0442 \u0442\u0435 \u0436\u0435 <code>PENDING<\/code> -\u0437\u0430\u043f\u0438\u0441\u0438.<br>\u0412 \u0438\u0442\u043e\u0433\u0435 \u2014 <b>\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0433\u043e\u043d\u043a\u0438, \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/b>.<br><br>\ud83d\udcc9 \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438 \u0434\u043e\u043b\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 \u0438\u043b\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<br><br>\u2705 <b>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u2014 \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044e + \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438:<\/b><pre>@Transactional<br>@Scheduled(fixedRate = 10_000)<br>public void cleanUp() {<br>    List&lt;Job&gt; jobs = jobRepository.findAllByStatusForUpdate(PENDING); \/\/ SELECT ... FOR UPDATE<br>    jobs.forEach(job -&gt; {<br>        job.setStatus(PROCESSING);<br>        jobRepository.save(job);<br>    });<br>}<\/pre>\ud83d\udccc \u0418\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u043b\u0430\u0433 \u201clocked\u201d, \u0447\u0442\u043e\u0431\u044b \u044f\u0432\u043d\u043e \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u0432\u0437\u044f\u0442\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<br><br>\ud83d\udca1 \u041b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>@Scheduled(fixedDelay)<\/code> \u2014 \u043e\u043d <b>\u0436\u0434\u0451\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f<\/b> \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u042d\u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0435\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<br><br>\ud83e\udde0 \u041f\u043e\u0434\u0443\u043c\u0430\u0439\u0442\u0435 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c <code>@Scheduled<\/code> \u043d\u0430:<br><br>* Spring Batch (\u0435\u0441\u043b\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0434\u0436\u043e\u0431\u044b)<br>* Spring Integration \/ Flowable \/ Camunda (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0438 retry)<br>* Quartz (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438)<br><br>\ud83d\udcf2 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/max.ru\/bookjava\"><b>\u041c\u044b \u0432 MAX<\/b><\/a><br><br>\ud83d\udc49<a href=\"\/channels\/@BookJava\" title=\"\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 Java \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\">@BookJava<\/a>","text_length":1504,"media":{"root":"\/00e\/4BAAACEvoEwAAAAAT602gVqs218","photo":{"thumbs":{"m":{"w":281,"h":320,"hash":"0j9JJ3_TpmON7HTY1f80SQ&ts=1791167289"},"x":{"w":702,"h":800,"hash":"VxjE2rogVKzyrd6fCYQV4Q&ts=1791167289"},"y":{"w":1123,"h":1280,"hash":"7aZjgoaoyw-twuxqTVAk9Q&ts=1791167289"},"i":{"bytes":"AoACM|CjJI\/mN8zdTTPMb++fzpWP7xs+pph56ZoAd5jf3z+dJ5j\/AN8\/nTcUlAFyGRvKHzH86KbD\/qhRTsURP9849abk+\/5UpzvbHrTSCfSkSLk+\/wCVN5o2+4oxigCxF\/qxRTY\/uCiqsMa4+Y5U9fSm9vun8qKKLAJg+hpMH0NFFFgJ4wdg4NFFFa2Gf\/\/Z"}}}}},{"channel_id":1285566241,"post_id":4319,"date":1788250572000,"views":"53","text":"<img class='tg-emoji' loading='lazy' src='https:\/\/televisor.tlgrm.dev\/emoji\/5411225014148014586\/thumb.webp?hash=656Lwf-Yu66CKRf-_g94kQ&ts=1791167289' alt='\ud83d\udd34'><b> \u0417\u0430\u0432\u0442\u0440\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c<\/b><br><br><b>2 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f(\u0443\u0436\u0435 \u0437\u0430\u0432\u0442\u0440\u0430!) \u0432 19:00 \u043f\u043e \u043c\u0441\u043a<\/b> \u043f\u0440\u0438\u0445\u043e\u0434\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u043d\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u043d\u0430 Middle Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430.<br><br><b>\u041a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442:<\/b><br>\ud83d\udcc2 \u0421\u0435\u0440\u0433\u0435\u0439 \u0427\u0430\u043c\u043a\u0438\u043d, \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0437 Uzum, ex-WildBerries, \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443-\u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u0446\u0443<br>\ud83d\udcc2 C\u0435\u0440\u0433\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0440\u0435\u0441\u043f\u043e\u043d\u0434\u0435\u043d\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0435\u0433\u043e \u043e\u0442 \u0432\u0430\u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e<br>\ud83d\udcc2 \u0412 \u043a\u043e\u043d\u0446\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0432\u043e\u043f\u0440\u043e\u0441 \u0421\u0435\u0440\u0433\u0435\u044e<br><br><b>\u042d\u0442\u043e \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e. <\/b>\u042d\u0444\u0438\u0440 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u0435\u043d\u0442\u043e\u0440\u0441\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442 <a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/shortcut.education\"><b>\u0428\u041e\u0420\u0422\u041a\u0410\u0422<\/b><\/a> \u0434\u043b\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0442\u044f\u0442 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0433\u0440\u0435\u0439\u0434, \u0417\u041f \u0438 \u043f\u0440\u043e\u043a\u0430\u0447\u0430\u0442\u044c \u0441\u043a\u0438\u043b\u043b\u044b.<br><br><b>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438 \u0432 \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u0444\u0438\u0440 \u2192<\/b><a href=\"https:\/\/t.me\/shortcut_sh_bot?start=webinar_java_BookJava_09_01_2026\" target=\"_blank\" rel=\"noreferrer nofollow\"><b> @shortcut_sh_bot<\/b><\/a><br><br>\u0420\u0435\u043a\u043b\u0430\u043c\u0430.<br><a target=\"_blank\" rel=\"noreferrer nofollow\" href=\"https:\/\/ord.vk.com\/adv_info\">\u041e \u0440\u0435\u043a\u043b\u0430\u043c\u043e\u0434\u0430\u0442\u0435\u043b\u0435.<\/a>","text_length":772,"media":{"root":"\/00e\/3xAAACEvoEwAAAAAT602gVqs218","photo":{"thumbs":{"m":{"w":320,"h":320,"hash":"PceoJc0dCldUI1EE9gYhHA&ts=1791167289"},"x":{"w":800,"h":800,"hash":"cJnZKasqeHATbtmYkzx8HA&ts=1791167289"},"y":{"w":1080,"h":1080,"hash":"a9C1ZSrvOPv2qg9lnsuHzQ&ts=1791167289"},"i":{"bytes":"AoACg|DIBQDlcn60vDYCqdxqaBdwUCMPzzwP89jVyJFjhWQw4OPYHrQOKuykLOfbnZ+GalsJAjsjD3+tWIJW80B0Iydp4HXH\/wCuoLu3lFyzIh5GeKTV0OUU46Gj5gxgmis3ZeBPunHrwaKz5GY+zkFrEWVW80oo64FXA0Jj8vzT0wDjmo9725hgaQxqI8nGOuTV21mElmjsQCc8kDtWp0Rkl0KUULrKv7wsoOeFGKsSRKzBndm4xt7VeT513IxII4IC09Ubqx\/AgUApJaWMxnIyZH49KKm1dgtlIpQ84w2O+RxRQX7Vdgla3EYknC+mSue\/0qL7XZbAvmAAcAAf\/Y0UVT0Zzxeg+C8h5SOcgDoMf\/WqcTZP+ubH4f4UUUjojBNXZFduLi2kh8zk\/wCP0ooopD5Ef\/\/Z"}}}}}]