ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΈΠΏΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ 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 ΠΈΠ·Π½ΡΡΡΠΈ. ΠΡΠ°ΠΏΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
ΠΠΎΠ±ΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΡΡΠΎΠΊ ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ Ρ Π°Π±ΡΠ°Π²ΡΠ°Π½Π΅. Π£ΠΆΠ΅ 3 Π³ΠΎΠ΄Π° Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Spring. ΠΠ½Π΅ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Ρ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΎΠ½ ΡΡΡΡΠΎΠ΅Π½ Π²Π½ΡΡΡΠΈ. Π― ΠΏΠΎΠΈΡΠΊΠ°Π» ΡΡΠ°ΡΡΠΈ ΠΏΡΠΎ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Spring, Π½ΠΎ, ΠΊ ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π½Π°ΡΠ΅Π».
ΠΡΠ΅Ρ , ΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ Spring, ΠΏΡΠΎΡΡ ΠΏΠΎΠ΄ ΠΊΠ°Ρ.
ΠΠ° ΡΡ Π΅ΠΌΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠ°ΠΏΡ ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ApplicationContext. Π ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΠΌΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡΠΈΡ ΡΡΠ°ΠΏΠΎΠ². ΠΠ°ΠΊΠΎΠΉ-ΡΠΎ ΡΡΠ°ΠΏ Π±ΡΠ΄Π΅Ρ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Π° ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ Π² ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ .
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. ΠΠ΅ΡΡ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ Π½Π° ΡΠΈΡΡΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅.
ΠΠ°Π²Π°ΠΉΡΠ΅ Π΅ΡΠ΅ ΡΠ°Π· ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΡΡΠΎ ΠΆΠ΅ Ρ Π½Π°Ρ ΡΡΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ. Π£ Π½Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ BeanDefinition Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ° ClassName. ΠΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π½ΠΈΠΆΠ΅.
ΠΡΠ»ΠΈ PropertySourcesPlaceholderConfigurer Π½Π΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠΎΡ BeanDefinition, ΡΠΎ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ClassName, Π² ΠΏΠΎΠ»Π΅ host ΠΏΡΠΎΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ β «$
Π‘ΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΡΠΈ ΠΏΠΎΠ»Ρ ΠΏΡΠΎΠΈΠ½ΠΆΠ΅ΠΊΡΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎ Π±Ρ PropertySourcesPlaceholderConfigurer Π±ΡΠ» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² ΡΠΈΠΊΠ» Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ BeanDefinition, Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ.
ΠΠ»Ρ XML ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
PropertySourcesPlaceholderConfigurer ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ static. ΠΠ΅Π· static Ρ Π²Π°Ρ Π²ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π²Ρ Π½Π΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ @ Value Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠ° @Configuration.
3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ FactoryBean
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, ΡΡΡ Π²ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΠΈ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ. Π ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ΅Π½ Π΄ΡΡΠ³ΠΎΠΉ ΡΠ²Π΅Ρ? Π‘ΠΎΠ·Π΄Π°ΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½? ΠΠ΅ Π²ΠΎΠΏΡΠΎΡ.
Π ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ Π΅ΡΠ»ΠΈ Ρ Ρ ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΉ ΡΠ²Π΅Ρ? ΠΠΎΡ ΡΡΡ ΡΠΎ ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ Π½Π° ΠΏΠΎΠΌΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ FactoryBean.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°Π±ΡΠΈΠΊΡ ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΠ΅Ρ Π±ΠΈΠ½ΠΎΠ² ΡΠΈΠΏΠ° β Color.
ΠΠΎΠ±Π°Π²ΠΈΠΌ Π΅Π΅ Π² xml ΠΈ ΡΠ΄Π°Π»ΠΈΠΌ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠ΅ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ Π±ΠΈΠ½Ρ ΡΠΈΠΏΠ° β Color.
Π’Π΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π° ΡΠΈΠΏΠ° Color.class Π±ΡΠ΄Π΅Ρ Π΄Π΅Π»Π΅Π³ΠΈΡΠΎΠ²Π°ΡΡΡΡ ColorFactory, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ getObject.
ΠΠ»Ρ ΡΠ΅Ρ ΠΊΡΠΎ ΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ JavaConfig, ΡΡΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π±ΡΠ΄Π΅Ρ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ Π±Π΅ΡΠΏΠΎΠ»Π΅Π·Π΅Π½.
4. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π±ΠΈΠ½ΠΎΠ²
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π±ΠΈΠ½ΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ BeanFactory ΠΏΡΠΈ ΡΡΠΎΠΌ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ, Π΄Π΅Π»Π΅Π³ΠΈΡΡΠ΅Ρ ΡΡΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌ FactoryBean. ΠΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Π±ΠΈΠ½ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΠ°Π½Π΅Π΅ ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ BeanDefinition.
5. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π±ΠΈΠ½ΠΎΠ²
ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ BeanPostProcessor ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΠΊΠ»ΠΈΠ½ΠΈΡΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π²Π°ΡΠΈΡ Π±ΠΈΠ½ΠΎΠ² Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΏΠΎΠΏΠ°Π΄ΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π΅ΡΠ΅Ρ Π² ΡΠ΅Π±Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
ΠΡΠΎΡΠ΅ΡΡ Π΄ΠΎΠ½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° ΡΠΈΡΡΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅. ΠΠΎΡΡΠ΄ΠΎΠΊ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄ΡΡ Π²ΡΠ·Π²Π°Π½Ρ BeanPostProcessor Π½Π΅ ΠΈΠ·Π²Π΅ΡΡΠ΅Π½, Π½ΠΎ ΠΌΡ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΠΌ ΡΡΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½Ρ ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ.
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±Ρ Π»ΡΡΡΠ΅ ΠΏΠΎΠ½ΡΡΡ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌΡΡ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
ΠΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ², ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π΅Π»ΠΈΡΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π³ΡΡΠΏΠΏ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠ΅ΡΠ²Π°Ρ Π³ΡΡΠΏΠΏΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π° Π²ΡΠΎΡΠ°Ρ Π³ΡΡΠΏΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π½Π°ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π³ΡΡΠΏΠΏΡ, Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ·Π½Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΠΈ. ΠΠΎΠΏΡΡΡΠΈΠΌ Π²ΡΠΎΡΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΠ»ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π² ΠΈΡ Π±ΠΈΠ½Ρ ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ ΡΠΈΡΠ»Π°.
ΠΠ° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π° Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ Π±ΡΠ΄ΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎΠ»Ρ ΠΊΠ»Π°ΡΡΠ°, Π² ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΡΠΈΡΠ»Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡ 0 Π΄ΠΎ 10.
ΠΠ°ΡΠ΅ΠΌ, Π½ΡΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΡΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ BeanPostProcessor Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ InjectRandomInt.
ΠΠΎΠ΄ Π΄Π°Π½Π½ΠΎΠ³ΠΎ BeanPostProcessor Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ΅Π½, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ Π½Π° Π½Π΅ΠΌ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ, Π½ΠΎ ΡΡΡ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ.
BeanPostProcessor ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π±ΠΈΠ½ΠΎΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ Π΅Π³ΠΎ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Component, Π»ΠΈΠ±ΠΎ ΡΠ΅Π³Π΅ΡΡΡΠΈΡΡΠ΅ΠΌ Π΅Π³ΠΎ Π² xml ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ Π±ΠΈΠ½.
ΠΠ΅ΡΠ²Π°Ρ Π³ΡΡΠΏΠΏΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ²ΠΎΡ Π·Π°Π΄Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ»Π°. Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠΎΡΠ°Ρ Π³ΡΡΠΏΠΏΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈ Π½Π°ΡΠ°Π±ΠΎΡΠΊΠΈ.
Π ΠΈΡΠΎΠ³Π΅, Π²ΡΠ΅ Π±ΠΈΠ½Ρ ΡΠΈΠΏΠ° MyBean, ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌΡΠ΅ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°, Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡΡΡ Ρ ΡΠΆΠ΅ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ value1 ΠΈ value2. Π’Π°ΠΊΠΆΠ΅ ΡΡΡ ΡΡΠΎΠΈΡΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠ°ΠΏ Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΠΆΠ΅ΠΊΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΡΠΈ ΠΏΠΎΠ»Ρ Π±ΡΠ΄Π΅Ρ Π·Π°Π²ΠΈΡΠ΅ΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊΠΎΠΉ @ Scope Ρ Π²Π°ΡΠ΅Π³ΠΎ Π±ΠΈΠ½Π°. SCOPE_SINGLETON β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. SCOPE_PROTOTYPE β ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΠΎ Π·Π°ΠΏΡΠΎΡΡ. ΠΡΠΈΡΠ΅ΠΌ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°Ρ Π±ΠΈΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡΡ ΡΠ΅ΡΠ΅Π· Π²ΡΠ΅ BeanPostProcessor-Ρ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΄Π°ΡΠΈΡΡ ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
ΠΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ ΡΡΡ.
Π₯ΠΎΡΡ ΡΠΊΠ°Π·Π°ΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ EvgenyBorisov. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π΅Π³ΠΎ ΠΊΡΡΡΡ, Ρ ΡΠ΅ΡΠΈΠ»ΡΡ Π½Π° Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΡΠ°.
Π’Π°ΠΊΠΆΠ΅ ΡΠΎΠ²Π΅ΡΡΡ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π΅Π³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄ Ρ JPoint 2014.
Spring: Π² ΠΏΠΎΠΈΡΠΊΠ°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°
ΠΠ°ΡΡ ΠΌΠ΅ΡΡΡΠ΅Π² Π½Π°Π·Π°Π΄ Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΎΡΠΈΠ»Π΅ Π±ΡΠ» ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΉ ΠΏΠΎΡΡ ΠΏΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π° JVM. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠΊΠ»Π°Π΄Π° ΠΌΠΎΠΈ ΠΊΠΎΠ»Π»Π΅Π³ΠΈ Π·Π°Π΄Π°Π»ΠΈΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ Π²ΠΎΠΏΡΠΎΡΠΎΠΌ: Π° ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Spring Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΠΊΠ»Π°ΡΡΡ ΠΈΠ· ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°?
ΠΠΎΡΠ»Π΅ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ°ΡΠΎΠ² Π΄Π΅Π±Π°Π³Π° ΡΠΏΡΠΈΠ½Π³ΠΎΠ²ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΡΠΌ ΠΏΡΡΡΠΌ Π΄ΠΎΠΊΠΎΠΏΠ°Π»ΡΡ Π΄ΠΎ ΡΠΎΠΉ ΡΠ°ΠΌΠΎΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²Π΄Ρ.
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΎΡΠΈΠΈ
Π‘ΡΠ°Π·Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ, ΡΡΠΎ ApplicationContext β ΡΡΠΎ Π³Π»Π°Π²Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² Spring-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΠΊ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ, Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΡΠ°ΠΏΡ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ApplicationContext:
Π ΡΡΠΎΠΌ ΠΏΠΎΡΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΡΠ°ΠΏ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ 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, ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² Π½Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅, Π±ΡΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π½Ρ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΎΠ±ΠΎΠΈΡ Π±ΠΈΠ½ΠΎΠ², ΠΏΠΎ ΡΡΡΠΈ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ. ΠΠΎ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ Π·Π°Π³ΡΡΠ·ΠΈΠ»ΡΡ, Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ. ΠΠ· ΡΠ΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ»Π°, Π½ΠΎ ΠΏΡΠΎΠ²Π°Π»ΡΠ½Π°Ρ ΠΏΠΎΠΏΡΡΠΊΠ° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠ»ΠΎΠΌΠ°Π»Π°.
ΠΠΎΠΏΡΡΠ°Π΅ΠΌΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅ΡΠ΅ ΠΈ ΡΠ°ΠΌΠΈ Π±ΠΈΠ½Ρ ΠΏΠΎ ΠΈΡ ΠΈΠΌΠ΅Π½Π°ΠΌ:
ΠΡΠ»ΠΈ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ Π²Π°Π»ΠΈΠ΄Π½ΡΠΉ Π±ΠΈΠ½, ΡΠΎ Π²ΠΎ Π²ΡΠΎΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈΠ»Π΅ΡΠ΅Π» exception.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° stack trace: ΡΡΠ°Π±ΠΎΡΠ°Π»Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½Π°Ρ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΎΠ±Ρ ΠΎΠ΄ Π²ΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΎΠ² ΠΊΠ»Π°ΡΡΠΎΠ² Π² ΠΏΠΎΠΏΡΡΠΊΠ΅ Π½Π°ΠΉΡΠΈ ΠΈΡΠΊΠΎΠΌΡΠΉ ΠΊΠ»Π°ΡΡ ΡΡΠ΅Π΄ΠΈ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅. Π ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π΅ Π±ΡΠ» Π½Π°ΠΉΠ΄Π΅Π½, Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π²ΡΠ·ΠΎΠ²Π° ΠΌΠ΅ΡΠΎΠ΄Π° Utils.forName, ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΠΏΡΡΠΊΠ° Π½Π°ΠΉΡΠΈ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅ΡΠ½ΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ.
ΠΡΠΈ ΠΏΠΎΠ΄Π½ΡΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π·Π°Π³ΡΡΠ·ΠΈΠ»ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠ»Π°ΡΡ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠΏΡΡΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅ ΠΏΡΠΈΠ²Π΅Π»Π° ΠΊ ΠΎΡΠΈΠ±ΠΊΠ΅. ΠΠΎΡΠ΅ΠΌΡ ΡΠ°ΠΊ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ?
ΠΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΌΡ ΠΏΡΠΎΠΏΠΈΡΠ°Π»ΠΈ lazy-init:true ΠΈ Π·Π°ΠΏΡΠ΅ΡΠΈΠ»ΠΈ Spring ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±ΠΈΠ½Π°, Π³Π΄Π΅ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ°Π½Π΅Π΅ exception. ΠΡΠ»ΠΈ ΡΠ±ΡΠ°ΡΡ ΡΡΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ΠΈΠ· ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ lazy-init:false, ΡΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Π²ΡΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠ° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ»Π΅ΡΠΈΡ, Π½ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π° ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ. Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π±ΡΠ» ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, Π½ΠΎ ΠΌΡ Π½Π΅ ΡΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±ΠΈΠ½Π°, Ρ.ΠΊ. ΡΠΊΠ°Π·Π°Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡ Π½Π΅ Π±ΡΠ» Π½Π°ΠΉΠ΄Π΅Π½.
Groovy ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
ΠΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Groovy-ΡΠ°ΠΉΠ»Π°, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ GenericGroovyApplicationContext, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π½Π° Π²Ρ ΠΎΠ΄ ΡΡΡΠΎΠΊΡ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°. Π§ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°Π½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ GroovyBeanDefinitionReader. ΠΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ ΡΡΡΠΈ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Xml, ΡΠΎΠ»ΡΠΊΠΎ Ρ Groovy-ΡΠ°ΠΉΠ»Π°ΠΌΠΈ. Π ΡΠΎΠΌΡ ΠΆΠ΅, GroovyApplicationContext Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΈ Ρ Xml-ΡΠ°ΠΉΠ»ΠΎΠΌ.
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Groovy-ΡΠ°ΠΉΠ»Π°:
ΠΡΠΎΠ±ΡΠ΅ΠΌ ΠΏΡΠΎΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Ρ Xml:
ΠΡΠΈΠ±ΠΊΠ° Π²ΡΠ»Π΅ΡΠ°Π΅Ρ ΡΡΠ°Π·Ρ: Groovy ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Xml, ΡΠΎΠ·Π΄Π°Π΅Ρ BeanDefenition’Ρ, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡ ΡΡΠ°Π·Ρ Π²ΡΠ΄Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ° Π΄Π»Ρ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ»ΠΈ JavaConfig
ΠΠ°Π½Π½Π°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ Π΄Π²ΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ . Π ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ 2 Π²Π°ΡΠΈΠ°Π½ΡΠ°: JavaConfig ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π½Π°Π΄ ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ.
ΠΠ΄Π΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ: AnnotationConfigApplicationContext(βpackageβ/JavaConfig.class). Π Π°Π±ΠΎΡΠ°Π΅Ρ ΠΎΠ½ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ.
Π ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ AnnotationConfigApplicationContext Π΅ΡΡΡ 2 ΠΏΡΠΈΠ²Π°ΡΠ½ΡΡ ΠΏΠΎΠ»Ρ:
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΠΌ Π±ΠΈΠ½ΠΎΠΌ. Π‘ΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡΡ:
ΠΡΠ»ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ Xml ΠΈ Groovy Π·Π°Π³ΡΡΠ·ΠΈΠ»ΠΎΡΡ ΡΡΠΎΠ»ΡΠΊΠΎ BeanDefinition, ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΎ, ΡΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΏΠΎΠ΄Π½ΡΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠ΅, ΡΠ°ΠΊ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ BeanDefinition. Π ΡΠ»ΡΡΠ°Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· JavaConfig Π²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Π·Π°Π³ΡΡΠΆΠ°ΡΡΡΡ ΡΡΠ°Π·Ρ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΈ ΠΊΠ»Π°ΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ JavaConfig, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΡΠ°ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΈΠ½ΠΎΠΌ.
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: Π² ΡΠ»ΡΡΠ°Π΅ Ρ Xml ΠΈ Groovy ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠΌΠΈ Π·Π°Π³ΡΡΠ·ΠΈΠ»ΠΎΡΡ 343 ΡΠ°ΠΉΠ»Π°, Π·Π΄Π΅ΡΡ ΠΆΠ΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»Π° Π±ΠΎΠ»Π΅Π΅ βΡΡΠΆΠ΅Π»Π°Ρβ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ 631 Π΄ΠΎΠΏ ΡΠ°ΠΉΠ».
ΠΡΠ°ΠΏΡ ΡΠ°Π±ΠΎΡΡ ClassPathBeanDefinitionScanner:
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ°Π±ΠΎΡΡ ΡΠΊΠ°Π½Π΅ΡΠ° Π½Π° ΠΏΡΠΎΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ²:
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ 2 ΠΊΠ»Π°ΡΡΠ°: ΠΎΠ΄ΠΈΠ½ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ Component, Π²ΡΠΎΡΠΎΠΉ β Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ:
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ BeanDefinition Π΄Π»Ρ ΡΡΠΈΡ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ.
ΠΡΠ²ΠΎΠ΄
ΠΠ· Π²ΡΠ΅Π³ΠΎ Π²ΡΡΠ΅ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΏΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²Π΅ΡΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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.
Tip | |
---|---|
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:
Tip | |
---|---|
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
Tip | |
---|---|
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:
Note | |
---|---|
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
Note | |
---|---|
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
Note | |
---|---|
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.