Java Guru πŸ€“
13.2K subscribers
898 photos
15 videos
772 links
Канал с вопросами ΠΈ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ с собСсСдований!

По сотрудничСству ΠΈ Ρ€Π΅ΠΊΠ»Π°ΠΌΠ΅: @NadikaKir

Канал Π² ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ РКН: https://vk.cc/cJrSQZ

ΠœΡ‹ Π½Π° Π±ΠΈΡ€ΠΆΠ΅: telega.in/channels/javatasks/card?r=lcDuijdm
Download Telegram
Как ΠΎΡ‚Π»Π°Π΄ΠΈΡ‚ΡŒ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?

Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π΅, Π΅Π³ΠΎ ΠΏΠ°ΡƒΠ·Ρ‹ допустимы, Π° Ρƒ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΠ° Π½Π΅Ρ‚ сСтСвого доступа ΠΊ хосту, стандартный способ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ – нСпосрСдствСнно remote debug. Для этого ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ запускаСтся с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ JDWP. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠΎΡ€Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° jdb, ΠΈΠ»ΠΈ встроСнная Π² IDE.

Π’ JDK поставляСтся Π½Π°Π±ΠΎΡ€ инструмСнтов для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°. НапримСр Java Mission Control ΠΈ JConsole ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΈ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ мноТСство ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π΅Π³ΠΎ Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список инструмСнтов спСцифичСн для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ JVM, для HotSpot ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²
Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π’Π½Π΅ зависимости ΠΎΡ‚ ΠΎΠ±ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΡΡ‚Π², всСгда Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎ диагностичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΎΠ΄ΠΈΠ½ – Π»ΠΎΠ³Π°Ρ…. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π½ΠΈ ΠΎΠ΄ΠΈΠ½ встроСнный инструмСнт Π½Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ событиях, опрСдСляСмых бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ вашСго прилоТСния. Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΠΏΡ€ΠΈ любом ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.

Π’ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ поставку Java Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚ для логгирования java.util.logging, ΠΏΠΎΠ·ΠΆΠ΅ остановимся Π½Π° Π½Ρ‘ΠΌ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅. Π’Π°ΠΊΠΆΠ΅ сущСствуСт ряд популярных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ: Log4j, SLF4J, Logback.


Java GuruπŸ€“ #java
πŸ‘9πŸ”₯5
Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ WEB-INF, Π° ΠΊΠΎΠ³Π΄Π° META-INF?

Π’ ΠΊΠΎΡ€Π½Π΅ Π°Ρ€Ρ…ΠΈΠ²Π° java-прилоТСния часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ WEB-INF ΠΈ META-INF. ОбС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ хранят Π² сСбС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² тСкстовом Π²ΠΈΠ΄Π΅: yaml, xml, json, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ тСкст.

META-INF ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… всСх Ρ‚ΠΈΠΏΠΎΠ². Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ – MANIFEST.MF, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ Ρ€Π°Π½Π΅Π΅. Π’Π°ΠΌ ΠΆΠ΅ хранятся
β€’ ОбъявлСния ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² SPI;
β€’ Подпись Π°Ρ€Ρ…ΠΈΠ²Π°: Ρ„Π°ΠΉΠ»Ρ‹ .SF, .DSA, .RSA;
β€’ INDEX.LIST с подсказками ΠΎ мСстонахоТдСнии ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² для Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°.
Иногда (Π½Π΅ часто) прилоТСния Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Ρ‚ΡƒΠ΄Π° свои статичСскиС рСсурсы, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эта дирСктория ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² classpath ΠΈ доступна Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅.

WEB-INF ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² web-Π°Ρ€Ρ…ΠΈΠ²Π°Ρ… (.war). Она Π½Π΅ замСняСт, Π½ΠΎ дополняСт META-INF. Π’ Π½Π΅ΠΉ хранится:
β€’ Π“Π»Π°Π²Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» web-прилоТСния web.xml;
β€’ ДСскрипторы Ρ‚Π΅Π³ΠΎΠ² .TLD;
β€’ ΠŸΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ classes/ с классами web-прилоТСния;
β€’ ΠŸΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ lib/ с .jar-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ зависимостСй;
β€’ ΠŸΠΎΠ΄Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ tag/ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Ρ‚Π΅Π³ΠΎΠ².


Java GuruπŸ€“ #java
πŸ‘7❀6πŸ”₯3
МоТно Π»ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ части API?

Иногда этот вопрос ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Когда Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² пользованиС ΡˆΠΈΡ€ΠΎΠΊΠΎΠ³ΠΎ ΠΊΡ€ΡƒΠ³Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², Π½Π° Π΅Ρ‘ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ фактичСски накладываСтся ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости. Π’ΠΎ Π΅ΡΡ‚ΡŒ, Ссли Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ вСрсии Π²Π΄Ρ€ΡƒΠ³ ΠΏΡ€ΠΎΠΏΠ°Π΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ классы ΠΈ ΠΈΡ… Ρ‡Π»Π΅Π½Ρ‹, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π½Π΅ захотят ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ. Π’ΠΎΠ³Π΄Π° Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ остановится.

Π­Ρ‚ΠΎ ΠΌΠ°ΡΡˆΡ‚Π°Π±Π½Π°Ρ ΠΈ слоТная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’ Π΅Ρ‘ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сСмантичСскоС вСрсионированиС ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прСкращСния ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ (deprecation).

Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ API ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ
@Deprecated. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΎΠ½Π° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½Π° этапС компиляции ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅: ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ устарСл ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ большС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΡƒΠΆΠ΅ писали ΠΎΠ± особСнностях использования
@Deprecated. Π‘ΠΎΠ±ΠΈΡ€Π°ΡΡΡŒ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ API, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ @Deprecated(forRemoval=true).

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ запас Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π½Π° ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΡŽ. Они ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Deprecation policy – Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄Π°ΡŽΡ‚ ΠΎΠ±Π΅Ρ‰Π°Π½ΠΈΠ΅, сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ (ΠΈΠ»ΠΈ вСрсий) послС появлСния
@Deprecated ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ всё Π΅Ρ‰Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½.

Для поиска Π² ΠΊΠΎΠ΄Π΅ использования deprecated ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ JDK содСрТит ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρƒ jdeprscan. Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° javadoc собираСт список ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ страницу deprecated-list.html.


Java GuruπŸ€“ #java
πŸ‘12πŸ”₯6
Какой способ логирования Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ?

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ логирования, ΡΡ‚Π°Π²ΡˆΠΈΠ΅ стандартом Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ, Π² хронологичСском порядкС ΠΈΡ… появлСния:

β€’ java.util.Logging ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
β€’ Log4j (deprecated)
β€’ Logback
β€’ Log4j 2

ВсС эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ основныС Ρ„ΠΈΡ‡ΠΈ: ΡƒΡ€ΠΎΠ²Π½ΠΈ логирования (Ρ‡Ρ‚ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ), Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ хэндлСры (ΠΊΡƒΠ΄Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ), Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ (ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ). Π Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ происходило ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π² Π½ΡŽΠ°Π½ΡΠ°Ρ… каТдая ΠΈΠ· Π½ΠΈΡ… ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π»Π° ошибки ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ, сохраняя Π΅Ρ‘ прСимущСства. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ самыС свСТиС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ – Logback ΠΈ Log4j 2.

Для совмСщСния Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ-фасады, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ ΠΎΠ±Ρ‰ΠΈΠΉ интСрфСйс:
β€’ SLF4j
β€’ Apache Commons Logging (JCL)

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ bridge-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Они ΠΌΠ°ΡΠΊΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ΄Π½Ρƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ нСпосрСдствСнно ΠΏΠΎΠ΄ интСрфСйс Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π‘ ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ использованиС Π΄Π²ΡƒΡ… Ρ€Π°Π·Π½Ρ‹Ρ… фасадов, ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ вовсС Π±Π΅Π· фасадов.


Java GuruπŸ€“ #java
πŸ‘9❀5πŸ”₯5
Как ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°?

Если Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΈΠ»ΠΈ ΠΆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π»ΡƒΡ‡ΡˆΠ΅Π΅ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π²Ρ‹Π±ΠΎΡ€ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ тСстом ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎ ΠΈ послС. Π’Π°ΠΊΠΈΠ΅ тСсты Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ benchmark.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ – ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΡ‚ΡŒ врСмя Π΄ΠΎ, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΡˆΠ»ΠΎ. Π£ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π΅ΡΡ‚ΡŒ ряд нюансов. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π·Π°ΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ сильно ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ совсСм ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ тСстового, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина Π±ΡƒΠ΄Π΅Ρ‚ Β«ΠΏΡ€ΠΎΠ³Ρ€Π΅Ρ‚ΠΎΠΉΒ»: заполнятся Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ систСмныС кэши, ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄ΡƒΡ‚ JIT-ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ горячСго ΠΊΠΎΠ΄Π°, ΠΏΠ°ΠΌΡΡ‚ΡŒ наполнится мусором.

Наивный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ: Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… сцСнариСв Π½Π° Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΠΎΠΌ тСстовом стСндС. ΠŸΡ€ΠΈ тСстировании кусков Java ΠΊΠΎΠ΄Π° (Π² ΠΌΠΈΠΊΡ€ΠΎΠ±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°Ρ…) врСмя выполнСния ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ, поэтому упомянутыС Π½ΡŽΠ°Π½ΡΡ‹ вносят Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΊΠ»Π°Π΄ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚.

Π‘Π°ΠΌΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ – ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ инструмСнт ΠΈΠ· JDK, JMH. Для этого Π΅Π³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² зависимости, Π° тСстовый ΠΌΠ΅Ρ‚ΠΎΠ΄ помСчаСтся Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ
@Benchmark. ВСсты ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ исполняСмого jar-Ρ„Π°ΠΉΠ»Π°, Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π˜Ρ‚ΠΎΠ³ΠΈ тСстирования Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² консоль.

Java GuruπŸ€“ #java
πŸ‘10❀6πŸ”₯5
Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ phase, goal ΠΈ lifecycle Π² Maven?

Phase – Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ шаги ΠΈΠ·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… состоит lifecycle Π² Maven. Π’ΠΎΠΎΠ±Ρ‰Π΅, сущСствуСт Ρ‚Ρ€ΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»Π°:

β€’ Clean – Ρ„Π°Π·Ρ‹ pre-clean, clean, post-clean;
β€’ Default – validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy;
β€’ Site – pre-site, site, post-site, site-deploy.

Goal – это ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ выполняСмоС ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ дСйствиС. Плагин привязываСт свои Π³ΠΎΠ»Ρ‹ ΠΊ Ρ„Π°Π·Π°ΠΌ. НапримСр, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ mvn clean, Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ² сборки Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π΅ сама Ρ„Π°Π·Π° clean, Π° привязанная ΠΊ Π½Π΅ΠΉ Ρ†Π΅Π»ΡŒ clean:clean ΠΈΠ· встроСнного maven-clean-plugin.
Когда Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mvn пСрСдаСтся Ρ„Π°Π·Π°, ΠΊΡ€ΠΎΠΌΠ΅ Π½Π΅Π΅ самой выполнятся всС ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π΅ΠΉ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ лайфсайклС. ВмСсто Ρ„Π°Π·Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ†Π΅Π»ΡŒ (mvn clean:clean вмСсто mvn clean), Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ†Π΅Π»ΠΈ Π²Ρ‹Π·Π²Π°Π½Ρ‹ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ (Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ†Π΅Π»ΠΈ Ρ„Π°Π·Ρ‹ pre-clean).

Π€Π°Π·Ρ‹ всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π² ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅. Если ΠΊ ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°Π·Π΅ привязано нСсколько Ρ†Π΅Π»Π΅ΠΉ, ΠΎΠ½ΠΈ ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² порядкС объявлСния Π² pom.xml.

НСкоторыС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Ρ†Π΅Π»ΠΈ, Π½Π΅ привязанныС Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ Ρ„Π°Π·Π°ΠΌ. Π˜Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ явно.

Если Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ mvn пСрСдаСтся нСсколько Ρ„Π°Π·/Ρ†Π΅Π»Π΅ΠΉ, ΠΎΠ½ΠΈ выполнятся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. КаТдая Ρ†Π΅Π»ΡŒ Π² процСссС выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹.

Π’Π°ΠΊ, Π²Ρ‹Π·ΠΎΠ² mvn test package – Ρ‚ΠΎ ΠΆΠ΅ самоС Ρ‡Ρ‚ΠΎ mvn package, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС всС Ρ†Π΅Π»ΠΈ ΠΈΠ· Ρ„Π°Π·Ρ‹ test (ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…) ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ исполнСны ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ Π² package. mvn clean install Ρ‚Π°ΠΊ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π΅ получится, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Ρ„Π°Π·Ρ‹ ΠΈΠ· Ρ€Π°Π·Π½Ρ‹Ρ… ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹Ρ… Ρ†ΠΈΠΊΠ»ΠΎΠ².


Java GuruπŸ€“ #java
πŸ”₯11πŸ‘10❀3
Как Spring Framework Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Dependency Injection?

Π˜Π½Π²Π΅Ρ€ΡΠΈΡ контроля (inversion of control, IoC) – ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ проСктирования, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ управлСния пСрСдаСтся Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ. Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ модуля этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ избавляСт ΠΎΡ‚ нСобходимости Π·Π½Π°Ρ‚ΡŒ ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… модулях ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ дСталях ΠΈΡ… взаимодСйствия. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ становится Π±ΠΎΠ»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΈΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ, ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ΡΠ²ΡΠ·Π½ΠΎΡΡ‚ΡŒ.

Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй (Dependency Injection, DI) – ΠΎΠ΄Π½Π° ΠΈΠ· Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ IoC. ΠŸΡ€ΠΈ взаимодСйствии с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ модулями, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ высокоуровнСвыми абстракциями, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ конкрСтная Π΅Ρ‘ рСализация поставляСтся Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ.

Бтандартная рСализация DI – Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ инстанциируСт всС сСрвисы, ΠΈ складываСт ΠΈΡ… Π² IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. ΠŸΡ€ΠΈ этом ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ, Service Locator, занимаСтся поиском соотвСтствия Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ абстракциям ΠΈ ΠΈΡ… Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ.

Spring – большой Π½Π°Π±ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. DI рСализуСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· основных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ – Spring IoC.

Бущности бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ Π² Spring, ΠΊΠ°ΠΊ ΠΈ Π² JavaEE Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ beans. Π‘ΠΈΠ½Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами, ΠΊΠΎΡ€Π½ΠΈ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΈΠ· Π½ΠΈΡ… Π»Π΅ΠΆΠ°Ρ‚ Π² понятии Configuration. Π’ качСствС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π±ΠΈΠ½ΠΎΠ² выступаСт ApplicationContext. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ зависимости контСксту, ΠΎΠ½Π° помСчаСтся Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ
@Autowired.

Java GuruπŸ€“ #java
πŸ‘10❀3πŸ”₯3
Какой Ρƒ Spring Π±ΠΈΠ½ΠΎΠ² скоуп ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ?

Π’ Spring Framework Π²ΠΎ всСх опрСдСлСниях бизнСс-сущностСй (bean) явно ΠΈΠ»ΠΈ нСявно присутствуСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ scope. Π’ Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ½ пСрСдаСтся Π² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Scope, Π² xml – Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ scope Ρ‚Π΅Π³Π° <bean>.

Атрибут scope – это строка-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, которая ставит Π±ΠΈΠ½Ρƒ Π² соотвСтствиС экзСмпляр класса org.springframework.beans.factory.config.Scope. Π‘ΠΊΠΎΡƒΠΏ – рСализация ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° «стратСгия» для Ρ„Π°Π±Ρ€ΠΈΠΊ Π±ΠΈΠ½ΠΎΠ², инструкция ΠΏΠΎ созданию бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².

Π’ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΌ Spring-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ всСгда сущСствуСт Π΄Π²Π° сокоупа:
β€’ singleton – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… внСдрСниях ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ. ПолСзСн для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° случаСв: Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ сСрвисы, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π±Π΅Π· состояния, нСизмСняСмыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, это Π½Π΅ класс-синглтон: ΠΏΡ€ΠΈ объявлСнии Π΄Π²ΡƒΡ… Π±ΠΈΠ½ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса ΠΈΡ… экзСмпляров Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²Π°. Π­Ρ‚ΠΎ скоуп ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
β€’ prototype – ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊΠ° Π±ΠΈΠ½ΠΎΠ² создаСт Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. НуТСн для измСняСмых Π±ΠΈΠ½ΠΎΠ² с состояниСм.

Spring Web добавляСт 4 Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… скоупа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π΅Π»Π°ΡŽΡ‚ Π±ΠΈΠ½ синглтоном Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСтСвого запроса (request), клиСнтской сСссии (session), контСкста сСрвлСта (application) ΠΈ вСбсокСт-сСссии (websocket).

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ собствСнныС скоупы. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² самих исходниках Spring: SimpleThreadScope, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Π±ΠΈΠ½ Ρ‚Ρ€Π΅Π΄-Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ. Для использования Π΅Π³ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ скоупы, Π½ΡƒΠΆΠ½ΠΎ сначала Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² BeanFactory.


Java GuruπŸ€“ #java
❀9πŸ‘4πŸ”₯4😐3
КакиС отличия ΠΌΠ΅ΠΆΠ΄Ρƒ @⁠Component, @⁠Service, @⁠Repository ΠΈ @⁠Controller?

@Component – простой способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ объявлСниС класса объявлСниСм Spring-Π±ΠΈΠ½Π°. Из всСх ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΏΠ°Π»ΠΈ Π² сканированиС (ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π½Π°Π΅Ρ‚ @ComponentScan), Π±ΡƒΠ΄ΡƒΡ‚ созданы Π±ΠΈΠ½-Π΄Π΅Ρ„ΠΈΠ½ΠΈΡˆΠ½Ρ‹.

ΠžΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ – это алиасы Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ
@Component. Π‘Π°ΠΌΠΈ ΠΏΠΎ сСбС ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ повСдСния, ΠΈ тСхничСски Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ядра Spring Framework Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚Π°ΠΊ ΠΆΠ΅.

Π­Ρ‚ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Β«Stereotype annotationsΒ». Π˜Ρ… Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ – сСмантика, логичСская Ρ€ΠΎΠ»ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²:
β€’ @⁠Service – рСализация бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ;
β€’ @⁠Repository – Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π΄Π°Π½Π½Ρ‹Ρ…: Β«Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉΒ» ΠΈΠ· Domain-Driven Design ΠΈΠ»ΠΈ классичСский DAO;
β€’ @⁠Controller – ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π΅Π±-запросов (ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹
@RequestMapping)

Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ этой сСмантикой. НапримСр, трансляция ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Persistence API Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ… стСрСотипа
@Repository. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… случаях ΠΊΡ€ΠΎΠΌΠ΅ сСмантики ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

Java GuruπŸ€“ #java
πŸ‘9πŸ”₯6❀3
КакиС Π·Π°Π΄Π°Ρ‡ΠΈ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Spring Data?

Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с систСмами доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ: рСляционными ΠΈ нСрСляционными Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, map-reduce Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ ΠΈ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ. Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Π°Ρ концСпция ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° – Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½Π° (Domain-driven design, DDD).

Spring Data состоит ΠΈΠ· мноТСства ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Ρ€Π°Π·Π½Ρ‹Ρ… случаСв ΠΆΠΈΠ·Π½ΠΈ. Π’ΠΎΡ‚ самыС популярныС ΠΈΠ· Π½ΠΈΡ…:

β€’ Spring Data JPA – Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Java Persistence API, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Hibernate.
β€’ Spring Data JDBC – Π±ΠΎΠ»Π΅Π΅ простой ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ‡Π΅ΠΌ JPA Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ для JDBC-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ².
β€’ Spring Data REST – созданиС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… hypermedia-driven RESTful сСрвисов Π½Π° основС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π².
β€’ Spring Data KeyValue – Ρ€Π°Π±ΠΎΡ‚Π° с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°ΠΌΠΈ Ρ‚ΠΈΠΏΠ° ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
β€’ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰: MongoDB, Redis, Cassandra, LDAP, ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ….


Java GuruπŸ€“ #java
πŸ”₯8❀4πŸ‘4
Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Aware интСрфСйсы Π² Spring?

Π’ Spring Framework сущСствуСт большоС количСство Β«Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ…Β» (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ скоупа) сущностСй-синглтонов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π±ΠΈΠ½Π°ΠΌΠΈ. ЕстСствСнно, всС сразу ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±ΠΈΠ½Ρƒ, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ внСдрСния для Π½ΠΈΡ… Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Но Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ способ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ.

ΠœΠ°Ρ€ΠΊΠ΅Ρ€Π½Ρ‹ΠΉ интСрфСйс Aware слуТит Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ количСству интСрфСйсов с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ *Aware. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· Π½ΠΈΡ…, ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, доставляСт Π±ΠΈΠ½Ρƒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΡƒΡŽ для сСбя ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ. Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ контСксту прилоТСния, Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ApplicationContextAware.

ВСхничСски, сами интСрфСйсы Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ FooAware ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ СдинствСнный ΠΌΠ΅Ρ‚ΠΎΠ΄ void setFoo(Foo value). Π§Π΅Ρ€Π΅Π· этот ΠΌΠ΅Ρ‚ΠΎΠ΄ связанный с интСрфСйсом BeanPostProcessor пСрСдаст Π² Π±ΠΈΠ½ Π½ΡƒΠΆΠ½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ.

Если Π±ΠΈΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ServletContextAware, Ρ‚ΠΎ Π² процСссС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π° ΠΊ Π½Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ServletContextAwareProcessor, ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ setServletContext с контСкстом сСрвлСта Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.


Java GuruπŸ€“ #java
πŸ‘7πŸ”₯4❀3
Какая Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ @⁠Controller ΠΈ @⁠RestController?

Controller – это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· стСрСотипов Spring Framework. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ сСтСвых запросов. ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ состоит ΠΈΠ· Π½Π°Π±ΠΎΡ€Π° ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @RequestMapping.

ΠžΡ‚Π²Π΅Ρ‚ Π½Π° запрос ΠΌΠΎΠΆΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ способами: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ просто Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° строку с ΠΈΠΌΠ΅Π½Π΅ΠΌ jsp-Ρ„Π°ΠΉΠ»Π°, ΠΈΠ»ΠΈ ΠΆΠ΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ResponseBodyEmitter, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ асинхронно Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΠΎΠ·ΠΆΠ΅. ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ пСрСчислСны Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ соврСмСнных API рСализуСтся ΠΏΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ REST. Π’ Π½Π΅ΠΉ каТдая ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ доступна ΠΏΠΎΠ΄ собствСнным URI. Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ возвращаСтся экзСмпляр класса этой сущности, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСобразуСтся Π² ΠΎΡ‚Π²Π΅Ρ‚ сСрвСра ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· HttpMessageConverter-ΠΎΠ². НапримСр, Π² JSON Π΅Π³ΠΎ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ MappingJackson2HttpMessageConverter. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот способ ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΠ»ΠΈ вСсь ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ
@ResponseBody.

@RestController – это просто сокращСнная запись для @Controller + @ResponseBody.

Java GuruπŸ€“ #java
πŸ”₯7πŸ‘6❀4πŸ‘Œ2
Как Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ класса?

Π’ Spring Framework сущСствуСт аннотация @Transactional. Π•ΠΉ помСчаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ класс, вСсь ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ имССтся Π² Π²ΠΈΠ΄Ρƒ транзакция Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ это понятиС опрСдСляСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΌ transactionManager-ΠΎΠΌ. Настройки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ изоляции, стратСгия роллбэка ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ этой Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ,
@Transactional Π΄Π΅Π»Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌ для этого класса ΠΈ всСх Π΅Π³ΠΎ наслСдников. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΆΠ΅, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Foo.bar() ΠΈΠ· Foo.baz(), Ρ‚ΠΎ транзакция Π½Π΅ создастся.

Π­Ρ‚ΠΎ происходит вслСдствиС Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Spring AOP добавляСт ΠΊΠΎΠ΄ открытия/закрытия Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· динамичСский proxy класс. Π’ΠΎ Π΅ΡΡ‚ΡŒ, вмСсто Foo индТСктится Π½Π΅Ρ‡Ρ‚ΠΎ, ΠΏΠΎΡ…ΠΎΠΆΠ΅Π΅ Π½Π° ΠΊΠΎΠ΄ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ – вмСсто Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ TransactionTemplate, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΊΠΎΠ΄ Π² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²
этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

Π”Ρ€ΡƒΠ³ΠΎΠΉ, Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТный Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ способ – ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Spring AOP с динамичСских прокси Π½Π° Π½Π΅Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° AspectJ:

@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)


Π’ Spring AOP Π΅ΡΡ‚ΡŒ понятиС weaving – этап добавлСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (аспСктов). Π’ нашСм случаС, это ΠΊΠΎΠ΄ открытия/закрытия Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π» weaving AspectJ этапа компиляции, Π² сборку Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ»Π°Π³ΠΈΠ½: aspectj-maven-plugin для maven, gradle-aspectj для gradle.


Java GuruπŸ€“ #java
πŸ‘10πŸ”₯5❀3
ΠžΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» Spring Bean

Beans – Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π·Π°Π±ΠΎΡ‚Ρ‹ Spring Framework. Π—Π° кулисами Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° с Π½ΠΈΠΌΠΈ происходит мноТСство процСссов. Π’ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ Π² Ρ€Π°Π·Π½Ρ‹Π΅ этапы ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ Ρ†ΠΈΠΊΠ»Π°. Π§Π΅Ρ€Π΅Π· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ этапы ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ взятый Π±ΠΈΠ½:

1. Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ВСхничСскоС Π½Π°Ρ‡Π°Π»ΠΎ ΠΆΠΈΠ·Π½ΠΈ Π±ΠΈΠ½Π°, Ρ€Π°Π±ΠΎΡ‚Π° конструктора Π΅Π³ΠΎ класса;

2. Установка свойств ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π°, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй;

3. Нотификация aware-интСрфСйсов. BeanNameAware, BeanFactoryAware ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ΠœΡ‹ ΡƒΠΆΠ΅ писали ΠΎ Ρ‚Π°ΠΊΠΈΡ… интСрфСйсах Ρ€Π°Π½Π΅Π΅. ВСхничСски, выполняСтся систСмными ΠΏΠΎΠ΄Ρ‚ΠΈΠΏΠ°ΠΌΠΈ BeanPostProcessor, ΠΈ совпадаСт с шагом 4;

4. ΠŸΡ€Π΅-инициализация – ΠΌΠ΅Ρ‚ΠΎΠ΄ postProcessBeforeInitialization() интСрфСйса BeanPostProcessor;

5. Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ. Π Π°Π·Π½Ρ‹Π΅ способы ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ порядкС:
β€’ ΠœΠ΅Ρ‚ΠΎΠ΄ Π±ΠΈΠ½Π° с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ
@PostConstruct ΠΈΠ· стандарта JSR-250 (Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹ΠΉ способ);
β€’ ΠœΠ΅Ρ‚ΠΎΠ΄ afterPropertiesSet() Π±ΠΈΠ½Π° ΠΏΠΎΠ΄ интСрфСйсом InitializingBean;
β€’ Init-ΠΌΠ΅Ρ‚ΠΎΠ΄. Для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° Π΅Π³ΠΎ имя устанавливаСтся Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ опрСдСлСния initMethod. Π’ xml-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для всСх Π±ΠΈΠ½ΠΎΠ² сразу, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ default-init-method;

6. ΠŸΠΎΡΡ‚-инициализация – ΠΌΠ΅Ρ‚ΠΎΠ΄ postProcessAfterInitialization() интСрфСйса BeanPostProcessor.
Когда IoC-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠ°ΡΡ‚ΠΎΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этап ΡˆΡ‚Π°Ρ‚Π½ΠΎΠ³ΠΎ уничтоТСния Π±ΠΈΠ½Π°. Как со всСми способами Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Java, ΠΏΡ€ΠΈ ТСстком Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ (kill -9) Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Π²Ρ‹Π·ΠΎΠ²Π° этого этапа Π½Π΅Ρ‚. Π’Ρ€ΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… способа Β«Π΄Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈΒ» Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ порядкС, Ρ‡Ρ‚ΠΎ симмСтричныС ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

1. ΠœΠ΅Ρ‚ΠΎΠ΄ с Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ
@PreDestroy;
2. ΠœΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π² свойствС destroyMethod опрСдСлния Π±ΠΈΠ½Π° (ΠΈΠ»ΠΈ Π² глобальном default-destroy-method);
3. ΠœΠ΅Ρ‚ΠΎΠ΄ destroy() интСрфСйса DisposableBean.

НС слСдуСт ΠΏΡƒΡ‚Π°Ρ‚ΡŒ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° с ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ контСкста ΠΈ этапами ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Ρ„Π°Π±Ρ€ΠΈΠΊ Π±ΠΈΠ½ΠΎΠ². О Π½ΠΈΡ… ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… публикациях.


Java GuruπŸ€“ #java
πŸ‘16❀6πŸ”₯3😐1
Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ JavaEE сСрвлСт Π² Spring Framework?

Web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Spring MVC тСхничСски само ΠΏΠΎ сСбС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° сСрвлСтах: всю ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ запросов Π±Π΅Ρ€Π΅Ρ‚ Π½Π° сСбя Π΅Π΄ΠΈΠ½Ρ‹ΠΉ DispatcherServlet. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ рСализуСтся ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Front Controller.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ нСзависимый ΠΎΡ‚ Spring-контСкста сСрвлСт ΠΈΠ»ΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного для этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π² Servlet API, Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ класс, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² web.xml ΠΊΠ°ΠΊ сСрвлСт, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ для сСрвлСта ΠΌΠ°ΠΏΠΏΠΈΠ½Π³.

Π‘Π΅Ρ€Π²Π»Π΅Ρ‚ ΠΆΠΈΠ²Π΅Ρ‚ Π²Π½Π΅ Spring-контСкста, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй Π² Π½Ρ‘ΠΌ просто Ρ‚Π°ΠΊ Π½Π΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ autowiring, Π½Π° этапС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСрвлСта вызываСтся статичСский SpringBeanAutowiringSupport.processInjectionBasedOnServletContext, с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ сСрвлСтом ΠΈ Π΅Π³ΠΎ контСкстом Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ…. Π’ этом ΠΆΠ΅ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π°Ρ€Π½ΠΎΠΌ классС Π΅ΡΡ‚ΡŒ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… срСдств для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с контСкстом ΠΈΠ·Π²Π½Π΅.

Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° построСна Π½Π° Spring Boot, созданиС Π±ΠΈΠ½Π° Ρ‚ΠΈΠΏΠ° ServletRegistrationBean ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сСрвлСты Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅. А для Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ добавлСния Π½Π° этапС компиляции, ΠΊ классу ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ примСняСтся
@ServletComponentScan. Π‘ этой Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ стартСр прилоТСния просканируСт ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π² контСкст всС web-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² стилС Servlet 3.0: классы с аннотациями @WebFilter, @WebListener ΠΈ @WebServlet.

Java GuruπŸ€“ #java
πŸ”₯6❀3πŸ‘3
Π’ Ρ‡Ρ‘ΠΌ прСимущСства ΠΈ нСдостатки Spring Boot?

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сущности Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° Spring Boot – это стартСры. Зависимости с названиями Π²ΠΈΠ΄Π° spring-boot-starter-xxx Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π΄Π²Π΅ основных Π·Π°Π΄Π°Ρ‡ΠΈ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΎΠ½ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ-зависимостСй; Π²ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ Π±ΠΈΠ½Ρ‹ ΠΈ ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, со Spring Boot Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ появляСтся ряд Ρ‚Π°ΠΊΠΈΡ… полСзностСй, ΠΊΠ°ΠΊ embedded-сСрвСр, конфигурация web-прилоТСния Π±Π΅Π· web.xml, ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, properties вынСсСнныС ΠΈΠ· ΠΊΠΎΠ΄Π° Π²ΠΎ внСшниС Ρ„Π°ΠΉΠ»Ρ‹.

НапримСр, spring-boot-starter-data-jpa даст Π²Π°ΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚ всСго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для использования JPA: Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€, ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΡƒΡŽ с Π½ΠΈΠΌ Π²Π΅Ρ€ΡΠΈΡŽ Hibernate, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Persistence API ΠΈ Spring Data. Π’ контСкстС прилоТСния появятся всС Π½ΡƒΠΆΠ½Ρ‹Π΅ для JPA Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² Π±ΠΈΠ½Ρ‹.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Spring Boot ускоряСт ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ boilerplate-ΠΊΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ ΡΡ„ΠΎΠΊΡƒΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° бизнСс-Π·Π°Π΄Π°Ρ‡Π°Ρ…. Π­Ρ‚ΠΎ Π±Ρ‹Π²Π°Π΅Ρ‚ особСнно Π²Π°ΠΆΠ½ΠΎ Π² микросСрвисной Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅, ΠΊΠΎΠ³Π΄Π° создаСтся большоС количСство ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, такая ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ СстСствСнно ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ большСй тяТСловСсности ΠΈ ΠΌΠ΅Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния.


Java GuruπŸ€“ #java
πŸ”₯10πŸ‘7❀5
Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° Π² синглтон?

РаньшС ΠΌΡ‹ ΡƒΠΆΠ΅
рассматривали различия скоупов singleton ΠΈ prototype Π² Spring Framework. Допустим ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π² singleton-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ внСдряСтся Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ со скоупом prototype – ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ создан Π΅Ρ‘ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚?

Если просто Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π±ΠΈΠ½Π° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ
@Scope(SCOPE_PROTOTYPE), ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Π±ΠΈΠ½ Π² синглтонС Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired – Π±ΡƒΠ΄Π΅Ρ‚ создан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ синглтон создаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹, ΠΈ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡƒ случится Ρ‚ΠΎΠΆΠ΅ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ ΠΏΡ€ΠΈ Π΅Π³ΠΎ создании (ΠΏΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ зависимости).

ΠŸΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ – ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚
@Autowired, ΠΈ Π΄ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· контСкста Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Для этого Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ context.getBean(MyPrototype.class).

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ автоматичСским Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ зависимостСй ΠΌΠΎΠΆΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° (ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ «Команда»). Автовайрится Π½Π΅ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° производящий Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Π‘ΠΎΠ»Π΅Π΅ красивый Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ – ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°. Π’ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ
@Scope ΠΊΡ€ΠΎΠΌΠ΅ самого scopeName доступСн Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ – proxyMode. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NO – прокси Π½Π΅ создаСтся. Но Ссли ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ INTERFACES ΠΈΠ»ΠΈ TARGET_CLASS, Ρ‚ΠΎ ΠΏΠΎΠ΄ @Autowired Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒΡΡ Π½Π΅ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° сгСнСрированный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠΌ прокси. И ΠΊΠΎΠ³Π΄Π° проксируСмый Π±ΠΈΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ скоуп prototype, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ прокси Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ.

Java GuruπŸ€“ #java
πŸ‘16πŸ”₯7❀4❀‍πŸ”₯1
ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса java.lang.Object

Π­Ρ‚ΠΎΡ‚ вопрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠ°ΠΊ способ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π³ΠΎΠ²ΠΎΡ€ – ΠΏΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΉΡ‚ΠΈ Π² обсуТдСнии Π΄Π°Π»Π΅ΠΊΠΎ Π²Π³Π»ΡƒΠ±ΡŒ. Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π²Π°ΠΆΠ½ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ сигнатуры – Π½Π΅ зная ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° вопросы ΠΏΠΎ этим ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ хотя Π±Ρ‹ Ρ€Π°ΡΡΡƒΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΡ‚Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡΡΡŒ ΠΎΡ‚ Π½ΠΈΡ…. Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ исходник ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ javadoc-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ. ΠŸΠΎΡΡ‚ΡƒΠΏΠΈΠΌ ΠΊΠ°ΠΊ Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€Π²ΡŒΡŽ, ΠΈ Π΄Π°Π»Π΅Π΅ рассмотрим ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ. Π˜Ρ… список:

πŸ”˜public final native Class<?> getClass()
πŸ”˜public native int hashCode()
πŸ”˜public boolean equals(Object obj)
πŸ”˜protected native Object clone() throws CloneNotSupportedException
πŸ”˜public String toString()
πŸ”˜public final native void notify()
πŸ”˜public final native void notifyAll()
πŸ”˜public final native void wait(long timeout) throws InterruptedException
πŸ”˜public final void wait(long timeout, int nanos) throws InterruptedException
πŸ”˜public final void wait() throws InterruptedException
πŸ”˜protected void finalize() throws Throwable


Java GuruπŸ€“ #java
Please open Telegram to view this post
VIEW IN TELEGRAM
❀8πŸ‘6πŸ”₯4
toString

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²ΠΎΠ΅ прСдставлСниС экзСмпляра. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ "ПолноСИмяКласса@Ρ…ΡΡˆΠ’16Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠΌΠ’ΠΈΠ΄Π΅" (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ "java.lang.Object@1a23b4f"). Π§Π°ΡΡ‚ΡŒ послС @ – Π½Π΅ адрСс Π² памяти, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ рСализация ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ нСсСт практичСской ΠΏΠΎΠ»ΡŒΠ·Ρ‹. ПолСзно Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π΄Π°ΠΆΠ΅ Ссли Π½Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² Π»ΠΎΠ³ΠΈΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ – ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅. Π“ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² x.toString() с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° null ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² String.valueOf(x).
πŸ‘11πŸ”₯5❀2