ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Spring: XML, Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Java конфигурация ΠΈ … Groovy

Π’ настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ Spring framework ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π½Ρ‹Ρ… способа конфигурирования контСкста, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… заслуТиваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ рассмотрСния.

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°

Π― создал ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ maven ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ подмодулями для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° конфигурирования контСкста. Π—Π° основу ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ модуля я взял ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Hello, Spring! ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ контСкста c использованиСм XML Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ конфигурирования, появившСмся Π² Spring.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ XML Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² создании xml Ρ„Π°ΠΉΠ»Π° (Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ носящСго названия Π²ΠΈΠ΄Π° Β«context.xmlΒ», Β«applicationContext.xmlΒ» ΠΈ Ρ‚.Π΄.), ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ Spring beans, процСсс ΠΈΡ… создания ΠΈ взаимосвязи ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ убСдимся, Ρ‡Ρ‚ΠΎ Π² ΠΊΠΎΠ΄Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Service ΠΈ @Inject ΠΈ сразу послС ΠΈΡ… удалСния напишСм ΠΈΠΌ Π·Π°ΠΌΠ΅Π½Ρƒ Π² xml:

Π€Π°ΠΉΠ» Β«/resource/applicationContext.xmlΒ» замСняСт ΠΈ класс ContextConfiguration ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ.

Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π±ΠΈΠ½ Β«coinΒ», ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Π΅ΠΌΡƒ Π² конструктор Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹ΠΉ Π±ΠΈΠ½, созданный ΠΈΠ· java.util.Random. БвязываниС Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΎ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² конструктор Π±ΠΈΠ½ Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ Π½Π° мСстС.

Π‘ΠΈΠ½ Β«coinΒ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ. GreeterTargetImpl Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ экзСмпляр Coin ΠΈ ΠΌΡ‹ Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ Π² этот Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½ΠΎΠΌΠ΅Ρ€ 0 ΠΈ, вмСсто создания Π±ΠΈΠ½Π° Π½Π° мСстС, ΠΌΡ‹ ссылаСмся Π½Π° Ρ€Π°Π½Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Β«coinΒ».

Π‘ΠΈΠ½ Β«greeterΒ» дСмонстрируСт Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² β€” ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

ΠšΡ€ΠΎΠΌΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² конструктора Π² xml ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ ΠΌΠΎΠΆΠ½ΠΎ сразу ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ значСния свойств, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ для создания экзСмпляров Π±ΠΈΠ½ΠΎΠ², Π½ΠΎ всСму этому я посвящу ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ, Π° ΠΏΠΎΠΊΠ° ΠΎΠ±ΠΎΠΉΠ΄ΡƒΡΡŒ простым ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ:

name = «coin» ref = «coin» />

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ созданиС контСкста Π½Π° ClassPathXmlApplicationContext ( «/applicationContext.xml» ) ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

ИспользованиСм XML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ приходится ΠΊΡ€ΠΎΠΌΠ΅ написания нСпосрСдствСнно ΠΊΠΎΠ΄Π° ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΈ Π΅Π³ΠΎ использованиС Π² Spring, ΠΏΡ€ΠΈ этом Π½Π΅ имСя возмоТности ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ошибки Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΎ запуска тСстов (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ прилоТСния). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ xml Ρ„Π°ΠΉΠ»Π΅ достаточно слоТно Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΡƒΡŽ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… дСйствий Π²ΠΎ врСмя создания контСкста.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, xml конфигурация прСдставляСт собой Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ описаниС прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ хранится ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ ΠΊΠΎΠ΄Π°, позволяя ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру прилоТСния Π±Π΅Π· пСрСсборки. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ xml ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС Spring beans сторонний ΠΊΠΎΠ΄. И, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π²Π°ΠΆΠ½Ρ‹ΠΌ, Π² ΠΊΠΎΠ΄Π΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ спСцифичныС для Spring Π²Π΅Ρ‰ΠΈ.

Annotations

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Spring context с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ ΡƒΠΆΠ΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π»ΠΎΡΡŒ Π² Hello, Spring!, Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² чистом Π²ΠΈΠ΄Π΅.

К ΠΊΠΎΠ΄Ρƒ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° добавится Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ класс:

Код ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ тСста придётся сильно ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² настоящий ΠΌΠΎΠΌΠ΅Π½Ρ‚ @ConfigurationContext Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ annotation-only ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, поэтому приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΡΡ‚Ρ‹Π»ΡŒ:

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, использованиС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ для опрСдСлСния Π±ΠΈΠ½ΠΎΠ² ΠΈ ΠΈΡ… зависимостСй, вСсьма ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Π½ΠΎ нСдостатков Ρƒ этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° большС всСго. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ контСкста получаСтся Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ нСостороТноС Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ всСго прилоТСния (ΠΈ это, ΠΎΠΏΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈ, Π½Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π΄ΠΎ запуска тСстов/прилоТСния). Π’Π°ΠΊ ΠΆΠ΅ Π² ΠΊΠΎΠ΄ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Spring спСцифичныС Π²Π΅Ρ‰ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ‚Ρ€ΡƒΠ΄Π½ΠΈΡ‚ΡŒ смСну ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹. Π‘ аннотациями использованиС стороннСго ΠΊΠΎΠ΄Π° Π»ΠΈΠ±ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΠΈΠ±ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΏΠΎΡ€ΠΎΠΊ ΠΈ костылСй. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, СдинствСнной Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ прилоТСния Π±ΡƒΠ΄Π΅Ρ‚ Π΅Π³ΠΎ пСрСсборка.

Java configuration

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ созданиС Π±ΠΈΠ½ΠΎΠ², Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠ΄Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ convention over configuration, соглашСния ΠΏΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ созданиСм Π±ΠΈΠ½ΠΎΠ² я понимаю созданиС Π±ΠΈΠ½ΠΎΠ² Π½Π° стадии формирования контСкста, Π° Π½Π΅ послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ.

Π’Π°ΠΆΠ½ΠΎ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ класса ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: нСсмотря Π½Π° ΠΈΡΠΊΡƒΡˆΠ΅Π½ΠΈΠ΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ класс Context, Π΄Π΅Π»Π°Ρ‚ΡŒ этого Π½Π΅ слСдуСт. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Spring создаст Π±ΠΈΠ½ ΠΈ ΠΈΠ· этого класса, Π° Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ имя класса. А имя Β«ContextΒ» ΡƒΠΆΠ΅ занято самим Spring.

Java конфигурация выглядит Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ достоинства ΠΈ нСдостатки. Π­Ρ‚ΠΎ ΠΈ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π² xml; ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ²; ΠΈ простой Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³; ΠΈ отсутствия spring спСцифичных Π²Π΅Ρ‰Π΅ΠΉ Π² ΠΊΠΎΠ΄Π΅; ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ выполнСния ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ дСйствий Π½Π° этапС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. К нСдостаткам, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, относится Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€ΡƒΡ‡Π½ΠΎΠ³ΠΎ создания Π±ΠΈΠ½ΠΎΠ² ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ пСрСсборки для ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прилоТСния.

Groovy

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Groovy скриптов ΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ beans DSL появилась Π² Ρ‡Π΅Ρ‚Π²Ρ‘Ρ€Ρ‚ΠΎΠΉ вСрсии Spring ΠΊΠ°ΠΊ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π±Π΅Π· нСдостатков. Groovy конфигурация Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ Π² сСбС достоинства XML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ Java ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΎΡΡ‚Π°Π²Π°ΡΡΡŒ друТСствСнной ΠΊ аннотациям.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ groovy ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ groovy runtime Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Spring ΠΈΠ·Π½ΡƒΡ‚Ρ€ΠΈ. Π­Ρ‚Π°ΠΏΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ контСкста

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ…Π°Π±Ρ€Π°Π²Ρ‡Π°Π½Π΅. Π£ΠΆΠ΅ 3 Π³ΠΎΠ΄Π° я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Spring. МнС всСгда Π±Ρ‹Π»ΠΎ интСрСсно Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ устроСн Π²Π½ΡƒΡ‚Ρ€ΠΈ. Π― поискал ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΡ€ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство Spring, Π½ΠΎ, ΠΊ соТалСнию, Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ нашСл.

ВсСх, ΠΊΠΎΠ³ΠΎ интСрСсуСт Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ устройство Spring, ΠΏΡ€ΠΎΡˆΡƒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

На схСмС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ основныС этапы поднятия ApplicationContext. Π’ этом постС ΠΌΡ‹ остановимся Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· этих этапов. Какой-Ρ‚ΠΎ этап Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, Π° ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ описан Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π°Ρ….

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

1. ΠŸΠ°Ρ€ΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ созданиС BeanDefinition

ЦСль ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ этапа β€” это созданиС всСх BeanDefinition. BeanDefinition β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Π±ΠΈΠ½Π°. Π’ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, какая Ρƒ вас конфигурация, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ парсирования ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Xml конфигурация

Для Xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс β€” XmlBeanDefinitionReader, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс BeanDefinitionReader. Π’ΡƒΡ‚ всС достаточно ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½ΠΎ. XmlBeanDefinitionReader ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ InputStream ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Document Ρ‡Π΅Ρ€Π΅Π· DefaultDocumentLoader. Π”Π°Π»Π΅Π΅ обрабатываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΈ Ссли ΠΎΠ½ являСтся Π±ΠΈΠ½ΠΎΠΌ, Ρ‚ΠΎ создаСтся BeanDefinition Π½Π° основС Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (id, name, class, alias, init-method, destroy-method ΠΈ Π΄Ρ€.). ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ BeanDefinition помСщаСтся Π² Map. Map хранится Π² классС DefaultListableBeanFactory. Π’ ΠΊΠΎΠ΄Π΅ Map выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° для сканирования ΠΈΠ»ΠΈ JavaConfig

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° для сканирования ΠΈΠ»ΠΈ JavaConfig Π² ΠΊΠΎΡ€Π½Π΅ отличаСтся ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· xml. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс AnnotationConfigApplicationContext.

Если Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π²ΠΎ Π²Π½ΡƒΡ‚Ρ€ΡŒ AnnotationConfigApplicationContext, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΄Π²Π° поля.

ClassPathBeanDefinitionScanner сканируСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ классов ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Component (ΠΈΠ»ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя @Component). НайдСнныС классы ΠΏΠ°Ρ€ΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ для Π½ΠΈΡ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ BeanDefinition.
Π§Ρ‚ΠΎΠ±Ρ‹ сканированиС Π±Ρ‹Π»ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ, Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ ΠΏΠ°ΠΊΠ΅Ρ‚ для сканирования.

Groovy конфигурация

Данная конфигурация ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Ρ‡Π΅Ρ€Π΅Π· Xml, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ Π½Π΅ XML, Π° Groovy. Π§Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΈ парсированиСм groovy ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ занимаСтся класс GroovyBeanDefinitionReader.

2. Настройка созданных BeanDefinition

ПослС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ этапа Ρƒ нас имССтся Map, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ хранятся BeanDefinition. АрхитСктура спринга построСна Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ наши Π±ΠΈΠ½Ρ‹ Π΅Ρ‰Π΅ Π΄ΠΎ ΠΈΡ… фактичСского создания, ΠΈΠ½Π°Ρ‡Π΅ говоря ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ доступ ΠΊ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌ класса. Для этого сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ интСрфСйс BeanFactoryPostProcessor, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ доступ ΠΊ созданным BeanDefinition ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ. Π’ этом интСрфСйсС всСго ΠΎΠ΄ΠΈΠ½ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠœΠ΅Ρ‚ΠΎΠ΄ postProcessBeanFactory ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ConfigurableListableBeanFactory. Данная Ρ„Π°Π±Ρ€ΠΈΠΊΠ° содСрТит ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π² Ρ‚ΠΎΠΌ числС getBeanDefinitionNames, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС BeanDefinitionNames, Π° ΡƒΠΆΠ΅ ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ BeanDefinition для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ….

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Ρ€ΠΎΠ΄Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса BeanFactoryPostProcessor. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, настройки ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… выносятся Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ property Ρ„Π°ΠΉΠ», ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ PropertySourcesPlaceholderConfigurer ΠΎΠ½ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΈ дСлаСтся inject этих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ inject дСлаСтся ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Ρƒ, Ρ‚ΠΎ Π΄ΠΎ создания экзСмпляра Π±ΠΈΠ½Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот ΠΊΠ»ΡŽΡ‡ Π½Π° само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· property Ρ„Π°ΠΉΠ»Π°. Π­Ρ‚Π° Π·Π°ΠΌΠ΅Π½Π° происходит Π² классС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс BeanFactoryPostProcessor. НазваниС этого класса β€” PropertySourcesPlaceholderConfigurer. Π’Π΅ΡΡŒ этот процСсс ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° рисункС Π½ΠΈΠΆΠ΅.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρƒ нас Ρ‚ΡƒΡ‚ происходит. Π£ нас имССтся BeanDefinition для класса ClassName. Код класса ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅.

Если PropertySourcesPlaceholderConfigurer Π½Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ этот BeanDefinition, Ρ‚ΠΎ послС создания экзСмпляра ClassName, Π² ΠΏΠΎΠ»Π΅ host проинТСктится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” «$» (Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ поля проинТСктятся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΠ²ΡƒΡŽΡ‰ΠΈΠ΅ значСния). Если PropertySourcesPlaceholderConfigurer всС Ρ‚Π°ΠΊΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ этот BeanDefinition, Ρ‚ΠΎ послС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ этого класса Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

БоотвСтствСнно Π² эти поля проинТСктятся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ значСния.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ PropertySourcesPlaceholderConfigurer Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² Ρ†ΠΈΠΊΠ» настройки созданных BeanDefinition, Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… дСйствий.

Для XML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

PropertySourcesPlaceholderConfigurer ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ объявлСн ΠΊΠ°ΠΊ static. Π‘Π΅Π· static Ρƒ вас всС Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π²Ρ‹ Π½Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ @ Value Π²Π½ΡƒΡ‚Ρ€ΠΈ класса @Configuration.

3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ кастомных FactoryBean

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, Ρ‚ΡƒΡ‚ всС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ссли Π½ΡƒΠΆΠ΅Π½ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ†Π²Π΅Ρ‚? Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½? НС вопрос.

А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ссли я Ρ…ΠΎΡ‡Ρƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· случайный Ρ†Π²Π΅Ρ‚? Π’ΠΎΡ‚ Ρ‚ΡƒΡ‚ Ρ‚ΠΎ ΠΈ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ интСрфСйс FactoryBean.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° созданиС всСх Π±ΠΈΠ½ΠΎΠ² Ρ‚ΠΈΠΏΠ° β€” Color.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Π΅ Π² xml ΠΈ ΡƒΠ΄Π°Π»ΠΈΠΌ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π΄ΠΎ этого Π±ΠΈΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° β€” Color.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ созданиС Π±ΠΈΠ½Π° Ρ‚ΠΈΠΏΠ° Color.class Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ColorFactory, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ создании Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ getObject.

Для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ JavaConfig, этот интСрфСйс Π±ΡƒΠ΄Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ бСсполСзСн.

4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляров Π±ΠΈΠ½ΠΎΠ²

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ экзСмпляров Π±ΠΈΠ½ΠΎΠ² занимаСтся BeanFactory ΠΏΡ€ΠΈ этом, Ссли Π½ΡƒΠΆΠ½ΠΎ, Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΠ΅Ρ‚ это кастомным FactoryBean. ЭкзСмпляры Π±ΠΈΠ½ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π½Π° основС Ρ€Π°Π½Π΅Π΅ созданных BeanDefinition.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

5. Настройка созданных Π±ΠΈΠ½ΠΎΠ²

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ BeanPostProcessor позволяСт Π²ΠΊΠ»ΠΈΠ½ΠΈΡ‚ΡŒΡΡ Π² процСсс настройки Π²Π°ΡˆΠΈΡ… Π±ΠΈΠ½ΠΎΠ² Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠΏΠ°Π΄ΡƒΡ‚ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ нСсСт Π² сСбС нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ².

ΠŸΡ€ΠΎΡ†Π΅ΡΡ донастройки ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° рисункС Π½ΠΈΠΆΠ΅. ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ BeanPostProcessor Π½Π΅ извСстСн, Π½ΠΎ ΠΌΡ‹ Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π½Π°Π΅ΠΌ Ρ‡Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ для Ρ‡Π΅Π³ΠΎ это Π½ΡƒΠΆΠ½ΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° дСлится Π½Π° нСсколько Π³Ρ€ΡƒΠΏΠΏ. НапримСр пСрвая Π³Ρ€ΡƒΠΏΠΏΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² занимаСтся написаниСм инфраструктуры ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π° вторая Π³Ρ€ΡƒΠΏΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΡ‹, занимаСтся написаниСм бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ. Допустим Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π³Ρ€ΡƒΠΏΠΏΠ΅ понадобился Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π² ΠΈΡ… Π±ΠΈΠ½Ρ‹ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ значСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ случайныС числа.

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС Π±ΡƒΠ΄Π΅Ρ‚ создана аннотация, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π°Ρ‚ΡŒΡΡ поля класса, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ случайных числС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ 0 Π΄ΠΎ 10.

Π—Π°Ρ‚Π΅ΠΌ, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ этой Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ BeanPostProcessor для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ InjectRandomInt.

Код Π΄Π°Π½Π½ΠΎΠ³ΠΎ BeanPostProcessor достаточно ΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π΅Π½, поэтому ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π½Π° Π½Π΅ΠΌ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ, Π½ΠΎ Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚.

BeanPostProcessor ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π±ΠΈΠ½ΠΎΠΌ, поэтому ΠΌΡ‹ Π΅Π³ΠΎ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅ΠΌ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @Component, Π»ΠΈΠ±ΠΎ рСгСстрируСм Π΅Π³ΠΎ Π² xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π±ΠΈΠ½.

ΠŸΠ΅Ρ€Π²Π°Ρ Π³Ρ€ΡƒΠΏΠΏΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² свою Π·Π°Π΄Π°Ρ‡Ρƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ вторая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π’ ΠΈΡ‚ΠΎΠ³Π΅, всС Π±ΠΈΠ½Ρ‹ Ρ‚ΠΈΠΏΠ° MyBean, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΈΠ· контСкста, Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ с ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ полями value1 ΠΈ value2. Π’Π°ΠΊΠΆΠ΅ Ρ‚ΡƒΡ‚ ΡΡ‚ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, этап Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² эти поля Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊΠΎΠΉ @ Scope Ρƒ вашСго Π±ΠΈΠ½Π°. SCOPE_SINGLETON β€” инициализация ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π½Π° этапС поднятия контСкста. SCOPE_PROTOTYPE β€” инициализация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠΎ запросу. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ваш Π±ΠΈΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· всС BeanPostProcessor-Ρ‹ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄Π°Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Ρ‚ΡƒΡ‚.

Π₯ΠΎΡ‡Ρƒ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ΅ спасибо EvgenyBorisov. Благодаря Π΅Π³ΠΎ курсу, я Ρ€Π΅ΡˆΠΈΠ»ΡΡ Π½Π° написаниС этого поста.

Π’Π°ΠΊΠΆΠ΅ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Π³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄ с JPoint 2014.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Spring: Π² поисках контСкста

ΠŸΠ°Ρ€Ρƒ мСсяцСв Π½Π°Π·Π°Π΄ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ Π±Ρ‹Π» ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ пост ΠΏΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ классов Π½Π° JVM. ПослС этого Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΌΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ задались Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ вопросом: Π° ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Spring для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ классы ΠΈΠ· контСкста?

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

ПослС ΠΌΠ½ΠΎΠ³ΠΈΡ… часов Π΄Π΅Π±Π°Π³Π° спринговых исходников ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡƒΡ‚Ρ‘ΠΌ докопался Π΄ΠΎ Ρ‚ΠΎΠΉ самой простой ΠΈ понятной ΠΏΡ€Π°Π²Π΄Ρ‹.

НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ

Π‘Ρ€Π°Π·Ρƒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ApplicationContext β€” это Π³Π»Π°Π²Π½Ρ‹ΠΉ интСрфСйс Π² Spring-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прилоТСния.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ нСпосрСдствСнно ΠΊ дСмонстрации, взглянСм Π½Π° этапы формирования ApplicationContext:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Π’ этом постС Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ этап, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ нас интСрСсуСт ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ созданиС BeanDefinition.

BeanDefinition β€” это интСрфСйс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ описываСт Π±ΠΈΠ½, Π΅Π³ΠΎ свойства, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ конструктора ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Π§Ρ‚ΠΎ касаСтся ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ самих Π±ΠΈΠ½ΠΎΠ², Ρƒ Spring Π΅ΡΡ‚ΡŒ 4 способа ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

Xml конфигурация

Π—Π° основу Π±Π΅Ρ€Π΅ΠΌ простой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚:

Π—Π΄Π΅ΡΡŒ слСдуСт Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ:

Π’ 25 строкС ΠΈΠ΄Π΅Ρ‚ объявлСниС ΠΈ инициализация ApplicationContext Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Xml.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Xml-Ρ„Π°ΠΉΠ» выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½Π° ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ class. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ свойство lazy-init=”true”: Π² этом случаС Π±ΠΈΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС запроса Π΅Π³ΠΎ ΠΈΠ· контСкста.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Spring ΠΏΡ€ΠΈ поднятии контСкста Ρ€Π°Π·Ρ€ΡƒΠ»ΠΈΡ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ с классами, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅:

РазбСрСмся с дСталями Xml ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ:

β€” Π§Ρ‚Π΅Π½ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ занимаСтся класс XmlBeanDefinitionReader, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс BeanDefinitionReader;

β€” XmlBeanDefinitionReader Π½Π° Π²Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ InputStream ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Document Ρ‡Π΅Ρ€Π΅Π· DefaultDocumentLoader:

β€” ПослС этого ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт этого Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° обрабатываСтся ΠΈ, Ссли ΠΎΠ½ являСтся Π±ΠΈΠ½ΠΎΠΌ, создаСтся BeanDefinition Π½Π° основС Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… (id, name, class, alias, init- method, destroy-method ΠΈ Π΄Ρ€.):

β€” ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ BeanDefinition помСщаСтся Π² Map, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ хранится Π² классС DefaultListableBeanFactory:

Π’ ΠΊΠΎΠ΄Π΅ Map выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ объявлСниС Π±ΠΈΠ½Π° с классом film.BadVillain:

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ получится, Ссли Ρ€Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ список созданных BeanDefenitionNames ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ классы:

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ класса film.BadVillain, ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π½Π΅ сущСствуСт, Spring ΠΎΡ‚Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π±Π΅Π· ошибок:

Cписок BeanDefenitionNames содСрТит 2 элСмСнта; Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ, Ρ‚Π΅ 2
BeanDefinition, сконфигурированныС Π² нашСм Ρ„Π°ΠΉΠ»Π΅, Π±Ρ‹Π»ΠΈ созданы.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΎΠ±ΠΎΠΈΡ… Π±ΠΈΠ½ΠΎΠ², ΠΏΠΎ сути, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹. Но, ΠΏΡ€ΠΈ этом ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс загрузился, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ. Из Ρ‡Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»Π°, Π½ΠΎ ΠΏΡ€ΠΎΠ²Π°Π»ΡŒΠ½Π°Ρ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ сломала.

ΠŸΠΎΠΏΡ‹Ρ‚Π°Π΅ΠΌΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΈ сами Π±ΠΈΠ½Ρ‹ ΠΏΠΎ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°ΠΌ:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Если Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ случаС Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ Π±ΠΈΠ½, Ρ‚ΠΎ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΏΡ€ΠΈΠ»Π΅Ρ‚Π΅Π» exception.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° stack trace: сработала отлоТСнная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° классов. ВыполняСтся ΠΎΠ±Ρ…ΠΎΠ΄ всСх Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠ² классов Π² ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π½Π°ΠΉΡ‚ΠΈ искомый класс срСди Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ€Π°Π½Π΅Π΅. И послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½ΡƒΠΆΠ½Ρ‹ΠΉ класс Π½Π΅ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Utils.forName, происходит ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π½Π°ΠΉΡ‚ΠΈ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ класс ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡŽ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΉ ошибки.

ΠŸΡ€ΠΈ поднятии контСкста загрузился Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ класс, ΠΏΡ€ΠΈ этом ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ„Π°ΠΉΠ»Π° Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π»Π° ΠΊ ошибкС. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ?

Всё ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ прописали lazy-init:true ΠΈ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΠ»ΠΈ Spring ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляр Π±ΠΈΠ½Π°, Π³Π΄Π΅ ΠΈ гСнСрируСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π°Π½Π΅Π΅ exception. Если ΡƒΠ±Ρ€Π°Ρ‚ΡŒ это свойство ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ lazy-init:false, Ρ‚ΠΎ описанная Π²Ρ‹ΡˆΠ΅ ошибка Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π»Π΅Ρ‚ΠΈΡ‚, Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ. Π’ нашСм случаС контСкст Π±Ρ‹Π» ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½, Π½ΠΎ ΠΌΡ‹ Π½Π΅ смогли ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ экзСмпляр Π±ΠΈΠ½Π°, Ρ‚.ΠΊ. ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ класс Π½Π΅ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½.

Groovy конфигурация

ΠŸΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ контСкста с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Groovy-Ρ„Π°ΠΉΠ»Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ GenericGroovyApplicationContext, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ строку с ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠ΅ΠΉ контСкста. Π§Ρ‚Π΅Π½ΠΈΠ΅ΠΌ контСкста Π² Π΄Π°Π½Π½ΠΎΠΌ случаС занимаСтся класс GroovyBeanDefinitionReader. Π­Ρ‚Π° конфигурация Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎ сути Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Xml, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Groovy-Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, GroovyApplicationContext Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с Xml-Ρ„Π°ΠΉΠ»ΠΎΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простого ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Groovy-Ρ„Π°ΠΉΠ»Π°:

ΠŸΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ с Xml:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Ошибка Π²Ρ‹Π»Π΅Ρ‚Π°Π΅Ρ‚ сразу: Groovy Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Xml, создаСт BeanDefenition’Ρ‹, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС постпроцСссор сразу Π²Ρ‹Π΄Π°Ρ‘Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° для сканирования ΠΈΠ»ΠΈ JavaConfig

Данная конфигурация отличаСтся ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…. Π’ конфигурация Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: JavaConfig ΠΈ аннотация Π½Π°Π΄ классами.

Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ контСкст: AnnotationConfigApplicationContext(β€œpackage”/JavaConfig.class). Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΠ½ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² конструктор.

Π’ контСкстС AnnotationConfigApplicationContext Π΅ΡΡ‚ΡŒ 2 ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… поля:

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с максимально простым Π±ΠΈΠ½ΠΎΠΌ. Π‘ΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ загрузится:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Если Π² случаС с Xml ΠΈ Groovy Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΎΡΡŒ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ BeanDefinition, сколько Π±Ρ‹Π»ΠΎ объявлСно, Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π² процСссС поднятия контСкста Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ BeanDefinition. Π’ случаС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· JavaConfig всС классы Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ сразу, Π² Ρ‚ΠΎΠΌ числС ΠΈ класс самого JavaConfig, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ сам являСтся Π±ΠΈΠ½ΠΎΠΌ.

Π•Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚: Π² случаС с Xml ΠΈ Groovy конфигурациями Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ»ΠΎΡΡŒ 343 Ρ„Π°ΠΉΠ»Π°, здСсь ΠΆΠ΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° Π±ΠΎΠ»Π΅Π΅ β€œΡ‚ΡΠΆΠ΅Π»Π°Ρβ€ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° количСством 631 Π΄ΠΎΠΏ Ρ„Π°ΠΉΠ».

Π­Ρ‚Π°ΠΏΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ClassPathBeanDefinitionScanner:

Рассмотрим Ρ€Π°Π±ΠΎΡ‚Ρƒ сканСра Π½Π° простом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для поиска ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… классов:

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ 2 класса: ΠΎΠ΄ΠΈΠ½ со стандартной Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Component, Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” с кастомной Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ:

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сформированныС BeanDefinition для этих классов ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ классы.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring

Π’Ρ‹Π²ΠΎΠ΄

Из всСго Π²Ρ‹ΡˆΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° поставлСнныС вопросы ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Spring JavaConfig Reference Guide

Rod Johnson

Costin Leau

Chris Beams

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

Preface

Spring Java Configuration (JavaConfig) provides a pure-Java means of configuring the Spring IoC container. By taking advantage of Java 5.0 language features such as annotations and generics, JavaConfig allows users to express configuration logic and metadata directly in code, alleviating any need for XML.

By relying only on basic Java syntax and language features, JavaConfig offers several distinct advantages:

To get a sense of how to use JavaConfig, let’s configure an application consisting of two beans:

Bootstrapping this application would then be as simple as the following:

While this example is a trivial one, JavaConfig can flex to meet the needs of the most complex and sophisticated enterprise applications. This guide will show you how.

1. Introduction

1.1. What this guide covers

This guide covers all aspects of Spring JavaConfig. It covers implementing and using @Configuration classes to configure the Spring IoC container and working with the feature set. It also covers extending and customizing JavaConfig.

1.1.1. Topics not covered

If general aspect oriented programming (AOP) concepts are unfamiliar, or AOP with Spring and AspectJ 5’s @Aspect style are unfamiliar, it is recommended that you first read Chapter 6. AOP from the Core Spring Framework documentation.

1.2. What JavaConfig requires to run

Spring 2.5.6 or higher

AspectJ 1.6.2 or higher

1.3. Where to get support

Professional from-the-source support for Spring JavaConfig is available from SpringSource, the company behind Spring.

1.4. Where to follow development

You can provide feedback and help make JavaConfig best serve the needs of the Spring community by interacting with the developers at the Spring JavaConfig Community Forum.

Report bugs and influence the JavaConfig project roadmap using Spring’s JIRA issue tracker.

Browse JavaConfig sources and subscribe to RSS commit feeds using the Spring’s FishEye service.

Stay tuned to Continuous Integration and nightly snapshot build status using Spring’s Bamboo service.

Subscribe to the Spring Community Portal and SpringSource Team Blog for the latest Spring news and announcements, including information on Spring JavaConfig releases.

1.5. How to retrieve and build JavaConfig from source

You must have Java 5.0 (or better) and Ant 1.7.0 (or better) installed to build JavaConfig from source.

.1. Publishing JavaConfig artifacts to a local Maven repository

1.6. How to import JavaConfig as an Eclipse project

The project should now be imported, error-free and ready for development.

1.7. How to obtain milestone builds

1.7.1. Via manual download

Milestone builds are available from Spring’s milestone build area.

1.7.2. Via Maven

To access milestone builds using Maven, add the following repositories to your Maven pom:

Then add the following dependency:

1.7.3. Via Ivy

To access milestone builds using Ivy, add the following repositories to your Ivy config:

Then declare the following dependency:

1.8. How to obtain nightly (aka ‘snapshot’) builds

1.8.1. Via manual download

Nightly builds are available from Spring’s snapshot build area.

1.8.2. Via Maven

To access nightly builds using Maven, add the following repositories to your Maven pom:

Then add the following dependency:

1.8.3. Via Ivy

To access nightly builds using Ivy, add the following repositories to your Ivy config:

Then declare the following dependency:

2. Authoring @Configuration classes

2.1. @Configuration

Annotating a class with the @Configuration indicates that the class may be used by JavaConfig as a source of bean definitions. The simplest possible @Configuration class would read as follows:

Because the semantics of the attributes to the @Configuration annotation are 1:1 with the attributes to the element, this documentation defers to the beans-definition section of Chapter 3, IoC from the Core Spring documentation. See also the Javadoc for @Configuration for details on each of the available annotation attributes.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springTip
Jump to Section 3.1, β€œ Bootstrapping applications with JavaConfigApplicationContext ” to see how @Configuration classes are used to create a Spring Application Context.

2.2. @Bean

2.2.1. Declaring a bean

For comparison sake, the configuration above is exactly equivalent to the following Spring XML:

2.2.2. Injecting dependencies

When @Bean s have dependencies on one another, expressing that dependency is as simple as having one bean method call another:

In the example above, the foo bean recevies a reference to bar via constructor injection.

2.2.3. Receiving lifecycle callbacks

2.2.3.1. Using JSR-250 annotations

JavaConfig, like the core Spring Framework, supports use of JSR-250 «Common Annotations». For example:

2.2.3.2. Using Spring interfaces

2.2.3.3. Using @Bean initMethodName / destroyMethodName attributes

The @Bean annotation supports specifying arbitrary initialization and destruction callback methods, much like Spring XML’s init-method and destroy-method attributes to the bean element:

Of course, in the case of Foo above, it would be equally as valid to call the init() method directly during construction:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springTip
Remember that because you are working directly in Java, you can do anything you like with your objects, and do not always need to rely on the container!

2.2.4. Using *Aware interfaces

If the class above were declared as a bean as follows:

2.2.5. Specifying bean scope

2.2.5.1. Using @Bean ‘s scope attribute

JavaConfig makes available each of the four standard scopes specified in Section 3.4, «Bean Scopes» of the Spring reference documentation.

The DefaultScopes class provides string constants for each of these four scopes. SINGLETON is the default, and can be overridden by supplying the scope attribute to @Bean annotation:

2.2.5.2. @ScopedProxy

Spring offers a convenient way of working with scoped dependencies through scoped proxies. The easiest way to create such a proxy when using the XML configuration is the element. JavaConfig offers equivalent support with the @ScopedProxy annotation, which provides the same semantics and configuration options.

If we were to port the the XML reference documentation scoped proxy example (see link above) to JavaConfig, it would look like the following:

2.2.5.3. Lookup method injection

As noted in the core documentation, lookup method injection is an advanced feature that should be comparatively rarely used. It is useful in cases where a singleton-scoped bean has a dependency on a prototype-scoped bean. JavaConfig provides a natural means for implementing this pattern. Note that the example below is adapted from the example classes and configuration in the core documentation linked above.

JavaConfig can easily create a subclass of CommandManager where the abstract createCommand() is overridden in such a way that it ‘looks up’ a brand new (prototype) command object:

2.2.6. Customizing bean naming

By default, JavaConfig uses a @Bean method’s name as the name of the resulting bean. This functionality can be overridden, however, using the BeanNamingStrategy extension point.

JavaConfigApplicationContext will be covered in detail in Chapter 3, Using @Configuration classes

2.2.7. Working with Spring FactoryBean implementations

The Spring container recognizes that LocalSessionFactoryBean implements the FactoryBean interface, and thus treats this bean specially: An instance of LocalSessionFactoryBean is instantiated, but instead of being directly returned, instead the getObject() method is invoked. It is the object returned from this call getObject() that is ultimately registered as the sessionFactory bean.

How then would we use LocalSessionFactoryBean in JavaConfig? The best approach is to extend the ConfigurationSupport base class and use the getObject() method:

3. Using @Configuration classes

3.1. Bootstrapping applications with JavaConfigApplicationContext

3.1.1. Construction Options

Instantiating the JavaConfigApplicationContext can be done by supplying @Configuration class literals to the constructor, and/or strings representing packages to scan for @Configuration classes.

3.1.1.1. Construction by class literal

Each of the class literals supplied to the constructor will be processed, and for each @Bean method encountered, JavaConfig will create a bean definition and ultimately instantiate and initialize the bean.

Passing multiple @Configuration classes:

3.1.1.2. Construction by base package

Base packages will be scanned for the existence of any @Configuration classes. Any candidate classes will then be processed much as if they had been supplied directly as class literals to the constructor.

Passing multiple base packages:

Matching packages and classes by wildcard:

The wildcard syntax for matching packages and classes above is based on Ant Patterns

3.1.1.3. Post-construction configuration

3.1.2. Accessing beans with getBean()

JavaConfigApplicationContext provides several variants of the getBean() method for accessing beans.

3.1.2.1. Type-safe access

The preferred method for accessing beans is with the type-safe getBean() method.

Disambuguation options

If more than one bean of type Service had been defined in the example above, the call to getBean() would have thrown an exception indicating an ambiguity that the container could not resolve. In these cases, the user has a number of options for disambiguation:

Indicating a @Bean as primary

Like Spring’s XML configuration, JavaConfig allows for specifying a given @Bean as primary :

After this modification, all calls to getBean(Service.class) will return the primary bean

Disambiguation by bean name

JavaConfig provides a getBean() variant that accepts both a class and a bean name for cases just such as these.

Because bean ids must be unique, this call guarantees that the ambiguity cannot occur.

Retrieve all beans of a given type

It is also reasonable to call the getBeansOfType() method in order to return all beans that implement a given interface:

Note that this latter approach is actually a feature of the Core Spring Framework’s AbstractApplicationContext (which JavaConfigApplicationContext extends) and is not type-safe, in that the returned Map is not parameterized.

3.1.2.2. String-based access

Beans may be accessed via the traditional string-based getBean() API as well. Of course this is not type-safe and requires casting, but avoids any potential ambiguity entirely:

3.2. Bootstrapping web applications with JavaConfigWebApplicationContext

JavaConfigWebApplicationContext allows for seamlessly bootstrapping @Configuration classes within your servlet container’s web.xml deployment descriptor. This process requires no Spring XML whatsoever:

4. Modularizing configurations

While the simplest configuration may be expressed as a single class that exposes several beans, it is often desirable to modularize configurations for reuse and clarity.

4.1. Partitioning bean definitions into multiple @Configuration classes

The simplest technique for modularizing configurations is to split up a single @Configuration class into multiple smaller classes:

The above configuration class might be supplied as a parameter to JavaConfigApplicationContext :

We can easily partition this configuration such that bean definitions are spread across two classes, instead of one:

Now simply supply both configuration classes to the constructor of JavaConfigApplicationContext :

4.2. Referencing beans across @Configuration classes

One configuration class may need to reference a bean defined in another configuration class (or in XML, for that matter). The preferred mechanism for doing this is using Spring’s @Autowired annotation:

4.2.1. Direct bean references with @Autowired

One @Configuration class may directly reference bean instances registered from another using Spring’s @Autowired annotation.

4.2.2. Fully-qualified bean references with @Autowired

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springTip
The ‘fully-qualified’ approach is generally preferred as it provides a the significant advantage of being able to easily navigate within an IDE to the source of the referenced bean.

Open issue: Should @AnnotationDrivenConfig be enabled by default? Rationale: given that @Autowired is the preferred method for referencing external beans, it is likely to need to be enabled in all but the most trivial configurations. See SJC-219.

4.3. Aggregating @Configuration classes with @Import

The @Import annotation provides just this kind of support, and it is the direct equivalent of the element found in Spring beans XML files.

Multiple configurations may be imported by supplying an array of classes to the @Import annotation

4.4. ConfigurationSupport

5. Working with externalized values

5.1. @ExternalValue

Externally defined values such as usernames, passwords, file paths, and the like may be accessed using @ExternalValue and one or more of JavaConfig’s ValueSource annotations.

5.1.1. @ExternalValue fields

com/acme/db.properties will be read from the classpath and the value associated with key datasource.username will be injected into the username field. The contents of db.properties might be as follows:

5.1.2. @ExternalValue methods

@ExternalValue may also be used as a method-level annotation

The primary advantage to using @ExternalValue methods is that rather than injecting the external value just once (as is done in the case of @ExternalValue fields), @ExternalValue methods are evaluated every time they’re referenced. As this is not usually required, @ExternalValue fields are the preferred method. A downside of @ExternalValue methods is that they should be abstract, requiring you to declare the entire @Configuration class abstract, and this is not in alignment with the semantics users typically associate with using the abstract keyword.

5.2. Available ValueSource annotations

ValueSource annotations may be used in conjunction:

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springNote
Explicit ordering of ValueSource annotations is not yet supported but will be soon. See SJC-170 and SJC-171 for details.

6. Combining configuration styles

JavaConfig can be used in conjunction with any or all of Spring’s other container configuration approaches.

6.1. JavaConfig and XML

6.1.1. Bootstrapping JavaConfig from XML with ConfigurationPostProcessor

Then, bootstrap an XML ApplicationContext:

6.1.1.1. Configuring configurations

An added benefit that comes along with bootstrapping JavaConfig from XML is that the configuration bean instances are eligible, just as any other bean, for dependency injection:

6.1.2. Bootstrapping XML from JavaConfig with @ImportXml

The @ImportXml annotation is provided to support importing beans defined in XML into @Configuration classes.

6.2. JavaConfig and Annotation-Driven Configuration

6.2.1. @AnnotationDrivenConfig

In JavaConfig, this same functionality is enabled with the @AnnotationDrivenConfig annotation

6.2.2. @ComponentScan

An equivalent for Spring XML’s is provided with the @ComponentScan annotation.

With the above very minimal configuration in the Config class, we can bootstrap and use the application as follows:

Please see «Chapter 3, IoC» of the core spring documentation for additional detail on Annotation-Driven Injection support.

7. Transaction-management support

7.1. @AnnotationDrivenTx

JavaConfig provides full support for the annotation-driven declarative transaction management features provided by the core Spring Framework with the @AnnotationDrivenTx annotation:

Like Spring XML’s element, @AnnotationDrivenTx expects the presence of a bean named transactionManager of type PlatformTransactionManager as in the example above. Should you wish to forego this convention and name a transaction manager bean another name, you may do as follows:

The other attributes available to the @AnnotationDrivenTx are similar to the attributes to the element. See the related documentation and the JavaDoc for @AnnotationDrivenTx for details.

8. AOP support

8.1. @AspectJAutoProxy

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springNote
The attributes to the @AspectJAutoProxy annotation are very similar to the attributes to the element. See the related documentation and the JavaDoc for @AspectJAutoProxy for details.

9. JMX support

9.1. @MBeanExport

As an equivalent to Spring XML’s element, JavaConfig provides the @MBeanExport annotation.

10. Testing support

10.1. JavaConfigContextLoader

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ spring. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ springNote
Unfortunately, due to compatibility constraints with the TestContext framework’s @ContextConfiguration annotation, the fully-qualified classname for com.bank.TransferAppConfig must be expressed as a string. This has a negative effect on refactorability, and will be improved in the future if possible. Vote for SJC-238 if this improvement is important to you.

11. Extending JavaConfig

11.1. @Plugin

Similar to Spring 2.0’s support for XML namespaces, JavaConfig provides an extensibility mechanism with the @Plugin annotation. The general intent is to allow for a more expressive and declarative way to register commonly used bean definitions.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *