Π Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠ² Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ BeanDefinition
Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Spring, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ XML. Π ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π±ΠΎΠ»ΡΡΡΡ ΡΠ°ΡΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
ΡΠ΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ°. ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π°ΠΆΠ΅ Π² ΡΡΠΈΡ
ΠΏΡΠΈΠΌΠ΅ΡΠ°Ρ
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ "Π±Π°Π·ΠΎΠ²ΡΡ
" Π±ΠΈΠ½ΠΎΠ² ΡΠ²Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π² XML-ΡΠ°ΠΉΠ»Π΅, Π° Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ. Π ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π½Π΅ΡΠ²Π½ΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² ΠΏΡΡΠ΅ΠΌ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ classpath. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΡ β ΡΡΠΎ ΠΊΠ»Π°ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΠΊΡΠΈΡΠ΅ΡΠΈΡΠΌ ΡΠΈΠ»ΡΡΡΠ° ΠΈ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅. ΠΡΠΎ ΡΡΡΡΠ°Π½ΡΠ΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ XML Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ Π±ΠΈΠ½Π°. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, @Component
), Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² AspectJ ΠΈΠ»ΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ Π²ΡΠ±ΡΠ°ΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈΠΌΠ΅ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°, Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅.
ΠΠ°ΡΠΈΠ½Π°Ρ ΡΠΎ Spring 3.0, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠΌ Spring JavaConfig, ΡΠ²Π»ΡΡΡΡΡ ΡΠ°ΡΡΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ Spring Framework. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ Π±ΠΈΠ½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Java, Π° Π½Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΡΡ
XML-ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠ·Π³Π»ΡΠ½ΠΈΡΠ΅ Π½Π° Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Configuration
, @Bean
, @Import
ΠΈ @DependsOn
ΠΊΠ°ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΈΡ
Π½ΠΎΠ²ΡΡ
Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ.
@Component
ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏΠ½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ
ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ @Repository
β ΡΡΠΎ ΠΌΠ°ΡΠΊΠ΅Ρ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ»Ρ ΠΈΠ»ΠΈ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ (ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΄Π°Π½Π½ΡΠΌ ΠΈΠ»ΠΈ DAO). Π‘ΡΠ΅Π΄ΠΈ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΌΠ°ΡΠΊΠ΅ΡΠ° - Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
Spring ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏΠ½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ: @Component
, @Service
ΠΈ @Controller
. @Component
β ΡΡΠΎ ΠΎΠ±ΡΠΈΠΉ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ Spring. @Repository
, @Service
ΠΈ @Controller
β ΡΡΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΎΡΠΌΡ @Component
Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ
ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ (Π½Π° ΡΡΠΎΠ²Π½ΡΡ
Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ, ΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠΌ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ). ΠΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ @Component
, Π½ΠΎ, Π΅ΡΠ»ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ
@Repository
, @Service
ΠΈΠ»ΠΈ @Controller
, Π²Π°ΡΠΈ ΠΊΠ»Π°ΡΡΡ Π±ΡΠ΄ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΈΠ»ΠΈ ΡΠ²ΡΠ·ΠΈ Ρ Π°ΡΠΏΠ΅ΠΊΡΠ°ΠΌΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΈ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏΠ½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΈΠ΄Π΅Π°Π»ΡΠ½ΡΠΌΠΈ ΡΠ΅Π»ΡΠΌΠΈ Π΄Π»Ρ ΡΡΠ΅Π·ΠΎΠ². @Repository
, @Service
ΠΈ @Controller
ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π½Π΅ΡΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ Π² Π±ΡΠ΄ΡΡΠΈΡ
Π²ΡΠΏΡΡΠΊΠ°Ρ
Spring Framework. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅ Π²ΡΠ±ΠΎΡ ΠΌΠ΅ΠΆΠ΄Ρ @Component
ΠΈ @Service
Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ, @Service
Π±ΡΠ΄Π΅Ρ ΡΠ²Π½ΠΎ Π»ΡΡΡΠΈΠΌ Π²ΡΠ±ΠΎΡΠΎΠΌ. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΠΎΡΠΌΠ΅ΡΠ΅Π½ΠΎ ΡΠ°Π½Π΅Π΅, @Repository
ΡΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠ°ΡΠΊΠ΅Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ Π½Π° Π²Π°ΡΠ΅ΠΌ ΡΡΠΎΠ²Π½Π΅ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΠΈ ΡΠΎΡΡΠ°Π²Π½ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ
Spring, ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π² Π²Π°ΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ΠΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ β ΡΡΠΎ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊ Π΄ΡΡΠ³ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @Service
, ΡΠΏΠΎΠΌΡΠ½ΡΡΠ°Ρ ΡΠ°Π½Π΅Π΅, ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠΈΡΡΠ΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ @Component
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
// ...
}
- ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ
@Component
Π΄Π΅Π»Π°Π΅Ρ ΡΠ°ΠΊ, ΡΡΠΎ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ@Service
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ@Component
.
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Component
annotation class Service {
// ...
}
- ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ
@Component
Π΄Π΅Π»Π°Π΅Ρ ΡΠ°ΠΊ, ΡΡΠΎ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ@Service
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ@Component
.
ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°ΡΡ ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ "ΡΠΎΡΡΠ°Π²Π½ΡΡ
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ". ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @RestController
ΠΈΠ· Spring MVC ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· @Controller
ΠΈ @ResponseBody
.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠΎΡΡΠ°Π²Π½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΡ ΠΈΠ· ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Π΅ΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @SessionScope
Π² Spring ΠΆΠ΅ΡΡΠΊΠΎ ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΠΈΠΌΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΊΠ°ΠΊ session
, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ proxyMode
. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ SessionScope
:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Scope(WebApplicationContext.SCOPE_SESSION)
public @interface SessionScope {
/**
* ΠΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ Π΄Π»Ρ {@link Scope#proxyMode}.
* <p>ΠΠΎ ΡΠΌΠΎΠ»ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ {@link ScopedProxyMode#TARGET_CLASS}.
*/
@AliasFor(annotation = Scope.class)
ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS;
}
@Target(AnnotationTarget.TYPE, AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
@MustBeDocumented
@Scope(WebApplicationContext.SCOPE_SESSION)
annotation class SessionScope(
@get:AliasFor(annotation = Scope::class)
val proxyMode: ScopedProxyMode = ScopedProxyMode.TARGET_CLASS
)
ΠΠ°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ @SessionScope
Π±Π΅Π· ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ proxyMode
ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
@Service
@SessionScope
public class SessionScopedService {
// ...
}
@Service
@SessionScope
class SessionScopedService {
// ...
}
Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ proxyMode
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
public class SessionScopedUserService implements UserService {
// ...
}
@Service
@SessionScope(proxyMode = ScopedProxyMode.INTERFACES)
class SessionScopedUserService : UserService {
// ...
}
ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π½Π° Π²ΠΈΠΊΠΈ-ΡΡΡΠ°Π½ΠΈΡΠ΅ Spring Annotation Programming Model.
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π±ΠΈΠ½ΠΎΠ²
Spring ΠΌΠΎΠΆΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ BeanDefinition
Π² ApplicationContext
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΠΊΠ»Π°ΡΡΠ° ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ:
@Service
public class SimpleMovieLister {
private MovieFinder movieFinder;
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
@Service
class SimpleMovieLister(private val movieFinder: MovieFinder)
@Repository
public class JpaMovieFinder implements MovieFinder {
// ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΡΡΠ΅Π½Π° Π΄Π»Ρ ΡΡΠ½ΠΎΡΡΠΈ
}
@Repository
class JpaMovieFinder : MovieFinder {
// ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠΏΡΡΠ΅Π½Π° Π΄Π»Ρ ΡΡΠ½ΠΎΡΡΠΈ
}
ΠΠ»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΡΡΠΈΡ
ΠΊΠ»Π°ΡΡΠΎΠ² ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
Π±ΠΈΠ½ΠΎΠ² Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ @ComponentScan
Π² ΠΊΠ»Π°ΡΡ @Configuration
, Π³Π΄Π΅ Π°ΡΡΠΈΠ±ΡΡ basePackages
ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠΈΠΌ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΌ ΠΏΠ°ΠΊΠ΅ΡΠΎΠΌ Π΄Π»Ρ Π΄Π²ΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ². (ΠΠ°ΠΊ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ, ΡΠ°Π·Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π·Π°ΠΏΡΡΡΠΌΠΈ, ΡΠΎΡΠΊΠΎΠΉ Ρ Π·Π°ΠΏΡΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΏΡΠΎΠ±Π΅Π»Π°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΏΠ°ΠΊΠ΅Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°).
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"])
class AppConfig {
// ...
}
value
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ (ΡΠΎ Π΅ΡΡΡ @ComponentScan("org.example")
).Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ XML:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example"/>
</beans>
<context:component-scan>
Π½Π΅ΡΠ²Π½ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ <context:annotation-config>
. ΠΠ±ΡΡΠ½ΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ <context:annotation-config>
ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ <context:component-scan>
.Π‘ΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² classpath ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π° Π² classpath. ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ JAR Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ant, ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π½Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΡΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ "ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»Ρ" Π² Π·Π°Π΄Π°ΡΠ΅ JAR. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ ΠΏΡΡΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°ΠΊΡΡΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΠΈΡΠΈΠΊ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΡΠ΅Π΄Π°Ρ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° JDK 1.7.0_45 ΠΈ Π²ΡΡΠ΅ (ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠ²Π΅ΡΡΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ('Trusted-Library') Π² Π²Π°ΡΠΈΡ ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ°Ρ - ΡΠΌ. https://stackoverflow.com/questions/19394570/java-jre-7u45-breaks-classloader-getresources).
ΠΠΎ ΠΏΡΡΠΈ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ JDK 9 (Jigsaw) ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ classpath Spring Π² ΡΠ΅Π»ΠΎΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ°ΠΊ, ΠΊΠ°ΠΊ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΊΠ»Π°ΡΡΡ Π²Π°ΡΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Ρ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ module-info
. ΠΡΠ»ΠΈ Π²Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΠ΅, ΡΡΠΎ Spring Π±ΡΠ΄Π΅Ρ Π²ΡΠ·ΡΠ²Π°ΡΡ Π½Π΅ΠΏΡΠ±Π»ΠΈΡΠ½ΡΠ΅ ΡΠ»Π΅Π½Ρ Π²Π°ΡΠΈΡ
ΠΊΠ»Π°ΡΡΠΎΠ², ΡΠ±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ 'ΠΎΡΠΊΡΡΡΡ' (ΡΠΎ Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ opens
Π²ΠΌΠ΅ΡΡΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ exports
Π² Π²Π°ΡΠ΅ΠΌ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ module-info
).
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, AutowiredAnnotationBeanPostProcessor
ΠΈ CommonAnnotationBeanPostProcessor
Π½Π΅ΡΠ²Π½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° component-scan. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΄Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅ - ΠΈ Π²ΡΠ΅ ΡΡΠΎ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π±ΠΈΠ½Π°, ΡΠΊΠ°Π·Π°Π½Π½ΡΡ
Π½Π° XML.
AutowiredAnnotationBeanPostProcessor
ΠΈ CommonAnnotationBeanPostProcessor
, Π²ΠΊΠ»ΡΡΠΈΠ² Π°ΡΡΠΈΠ±ΡΡ annotation-config
ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ false
.ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠ»ΡΡΡΠΎΠ² Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΡ, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ @Component
, @Repository
, @Service
, @Controller
, @Configuration
ΠΈΠ»ΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΠΎΠΉ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΠΌΠ° Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π° @Component
, ΡΠ²Π»ΡΡΡΡΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈ ΡΠ°ΡΡΠΈΡΡΡΡ ΡΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠ°Π±ΠΎΡΡ, ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠ΅ ΡΠΈΠ»ΡΡΡΡ. ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΈΡ
ΠΊΠ°ΠΊ Π°ΡΡΠΈΠ±ΡΡΡ includeFilters
ΠΈΠ»ΠΈ excludeFilters
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @ComponentScan
(ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ <context:include-filter />
ΠΈΠ»ΠΈ <context:exclude-filter />
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° <context:component-scan>
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ XML). ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΈΠ»ΡΡΡΠ° ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π°Π»ΠΈΡΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² type
ΠΈ expression
. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠΈ:
Π’ΠΈΠΏ ΡΠΈΠ»ΡΡΡΠ° | ΠΡΠΈΠΌΠ΅Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
---|---|---|
annotation (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ) |
|
ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ present ΠΈΠ»ΠΈ meta-present Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠΈΠΏΠ° Π² ΡΠ΅Π»Π΅Π²ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ . |
assignable |
|
ΠΠ»Π°ΡΡ (ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ), Π½Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ (ΡΠ°ΡΡΠΈΡΠ΅Π½Ρ ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ) ΡΠ΅Π»Π΅Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. |
aspectj |
|
ΠΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ° AspectJ, ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΠ΅Π»Π΅Π²ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ. |
regex |
|
Π Π΅Π³ΡΠ»ΡΡΠ½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠΎΠΏΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² ΡΠ΅Π»Π΅Π²ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². |
custom |
|
ΠΠ°ΡΡΠΎΠΌΠ½Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° |
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡΡΠ°Ρ Π²ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Repository
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ°Ρ Π²ΠΌΠ΅ΡΡΠΎ Π½ΠΈΡ
ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Ρ "ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ-Π·Π°Π³Π»ΡΡΠΊΠΎΠΉ":
@Configuration
@ComponentScan(basePackages = "org.example",
includeFilters = @Filter(type = FilterType.REGEX, pattern = ".*Stub.*Repository"),
excludeFilters = @Filter(Repository.class))
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"],
includeFilters = [Filter(type = FilterType.REGEX, pattern = [".*Stub.*Repository"])],
excludeFilters = [Filter(Repository::class)])
class AppConfig {
// ...
}
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π»ΠΈΡΡΠΈΠ½Π³Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ Π½Π° XML:
<beans>
<context:component-scan base-package="org.example">
<context:include-filter type="regex"
expression=".*Stub.*Repository"/>
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
</beans>
useDefaultFilters=false
Π² Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ² use-default-filters="false"
Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° <component-scan/>
. Π’Π°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ², Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
@Component
, @Repository
, @Service
, @Controller
, @RestController
ΠΈΠ»ΠΈ @Configuration
.ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ Π±ΠΈΠ½ΠΎΠ² Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Spring ΠΌΠΎΠ³ΡΡ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΎΡΠΈΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½ΠΎΠ² Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΎΠΉ ΠΆΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Bean
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π±ΠΈΠ½Π° Π² ΠΊΠ»Π°ΡΡΠ°Ρ
, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Configuration
. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ:
@Component
public class FactoryMethodComponent {
@Bean
@Qualifier("public")
public TestBean publicInstance() {
return new TestBean("publicInstance");
}
public void doWork() {
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΎΠΏΡΡΠ΅Π½Π°
}
}
@Component
class FactoryMethodComponent {
@Bean
@Qualifier("public")
fun publicInstance() = TestBean("publicInstance")
fun doWork() {
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΎΠΏΡΡΠ΅Π½Π°
}
}
ΠΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Spring, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠΌΠ΅Π΅Ρ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠΉ Π΄Π»Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ doWork()
. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΎΡΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠ°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, ΡΡΡΠ»Π°ΡΡΠΈΠΉΡΡ Π½Π° ΠΌΠ΅ΡΠΎΠ΄ publicInstance()
. ΠΠ½Π½ΠΎΡΠ°ΡΠΈΡ @Bean
ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΡΠ΅Ρ ΡΠ°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΡΠ΅ΡΠ΅Π· Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ @Qualifier
. ΠΡΡΠ³ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΡΡΠΎΠ²Π½Ρ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π·Π°Π΄Π°Π½Ρ, ΡΡΠΎ @Scope
, @Lazy
ΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ
ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ².
@Lazy
Π½Π° ΡΠΎΡΠΊΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΠ΅ @Autowired
ΠΈΠ»ΠΈ @Inject
. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΡΠΎ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΊΡΠΈ Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΌ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Ρ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΊΡΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½. ΠΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ Π΄Π»Ρ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ
Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌΠΈ, ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ ObjectProvider<MyTargetBean>
.ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎ ΡΠ°Π½Π΅Π΅, Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ:
@Component
public class FactoryMethodComponent {
private static int i;
@Bean
@Qualifier("public")
public TestBean publicInstance() {
return new TestBean("publicInstance");
}
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°
@Bean
protected TestBean protectedInstance(
@Qualifier("public") TestBean spouse,
@Value("#{privateInstance.age}") String country) {
TestBean tb = new TestBean("protectedInstance", 1);
tb.setSpouse(spouse);
tb.setCountry(country);
return tb;
}
@Bean
private TestBean privateInstance() {
return new TestBean("privateInstance", i++);
}
@Bean
@RequestScope
public TestBean requestScopedInstance() {
return new TestBean("requestScopedInstance", 3);
}
}
@Component
class FactoryMethodComponent {
companion object {
private var i: Int = 0
}
@Bean
@Qualifier("public")
fun publicInstance() = TestBean("publicInstance")
// ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π°
@Bean
protected fun protectedInstance(
@Qualifier("public") spouse: TestBean,
@Value("#{privateInstance.age}") country: String) = TestBean("protectedInstance", 1).apply {
this.spouse = spouse
this.country = country
}
@Bean
private fun privateInstance() = TestBean("privateInstance", i++)
@Bean
@RequestScope
fun requestScopedInstance() = TestBean("requestScopedInstance", 3)
}
Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ String
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° ΠΌΠ΅ΡΠΎΠ΄Π° country
ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π° age
Π΄ΡΡΠ³ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ privateInstance
. ΠΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠ·ΡΠΊΠ° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Spring Expression Language ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π° ΡΠ΅ΡΠ΅Π· ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ #{ <expression> }
. ΠΠ»Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ @Value
ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ Π½Π° ΠΏΠΎΠΈΡΠΊ ΠΈΠΌΠ΅Π½ Π±ΠΈΠ½ΠΎΠ² ΠΏΡΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ΅ΠΊΡΡΠ° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ Spring Framework 4.3, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° ΡΠΈΠΏΠ° InjectionPoint
(ΠΈΠ»ΠΈ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°: DependencyDescriptor
) Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠΎΡΠΊΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π±ΠΈΠ½Π°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠΎ ΠΊΠ°ΡΠ°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² Π±ΠΈΠ½Π°, Π° Π½Π΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ
ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ². ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π΄Π»Ρ Π±ΠΈΠ½ΠΎΠ², Π½Π°Ρ
ΠΎΠ΄ΡΡΠΈΡ
ΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ prototype. ΠΠ»Ρ Π΄ΡΡΠ³ΠΈΡ
ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΡΠΊΡ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·Π²Π°Π»Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π±ΠΈΠ½Π° Π² Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·Π²Π°Π»Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π°-ΠΎΠ΄ΠΈΠ½ΠΎΡΠΊΠΈ Ρ ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ). Π ΡΠ°ΠΊΠΈΡ
ΡΡΠ΅Π½Π°ΡΠΈΡΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΡΠΎΡΠΊΠΈ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Ρ ΡΠΎΠ±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΠΈ. Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ InjectionPoint
:
@Component
public class FactoryMethodComponent {
@Bean @Scope("prototype")
public TestBean prototypeInstance(InjectionPoint injectionPoint) {
return new TestBean("prototypeInstance for " + injectionPoint.getMember());
}
}
@Component
class FactoryMethodComponent {
@Bean
@Scope("prototype")
fun prototypeInstance(injectionPoint: InjectionPoint) =
TestBean("prototypeInstance for ${injectionPoint.member}")
}
ΠΠ΅ΡΠΎΠ΄Ρ Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Bean
Π² ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ Spring ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΈΠ½Π°ΡΠ΅, ΡΠ΅ΠΌ ΠΈΡ
Π°Π½Π°Π»ΠΎΠ³ΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ@Configuration
Π² Spring. Π Π°Π·Π½ΠΈΡΠ° ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΊΠ»Π°ΡΡΡ @Component
Π½Π΅Π»ΡΠ·Ρ ΡΠ°ΡΡΠΈΡΠΈΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ CGLIB Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΠ° Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈ ΠΏΠΎΠ»Π΅ΠΉ. CGLIB-ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ β ΡΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π²Π½ΡΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Bean
, Π² ΠΊΠ»Π°ΡΡΠ°Ρ
Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ @Configuration
ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠ»ΠΊΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
Π±ΠΈΠ½Π° Π½Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ. Π’Π°ΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΈΠΏΠΎΠ²ΠΎΠΉ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠΈ Java, Π° ΠΏΡΠΎΡ
ΠΎΠ΄ΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ ΠΏΡΠΈΠ²ΡΡΠ½ΠΎΠ΅ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΈ ΠΏΡΠΎΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ½ΠΎΠ² Π² Spring, Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΠΊ Π΄ΡΡΠ³ΠΈΠΌ Π±ΠΈΠ½Π°ΠΌ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΡΡΠΎΠ³ΠΎ, Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΏΠΎΠ»Ρ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ @Bean
Π² ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ @Component
ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ Java, Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ CGLIB ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ @Bean
, ΠΊΠ°ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡ
Π±Π΅Π· ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΈΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. ΠΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠΎΠ±ΡΠΉ ΡΠΌΡΡΠ» ΠΏΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π±ΠΈΠ½ΠΎΠ² ΠΏΠΎΡΡΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΈΠΏΠ° BeanFactoryPostProcessor
ΠΈΠ»ΠΈ BeanPostProcessor
), ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΊΠΈΠ΅ Π±ΠΈΠ½Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ Π½Π° ΡΠ°Π½Π½Π΅ΠΉ ΡΡΠ°Π΄ΠΈΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ Π·Π°ΠΏΡΡΠΊΠ° Π΄ΡΡΠ³ΠΈΡ
ΡΠ°ΡΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π² ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ.
ΠΡΠ·ΠΎΠ²Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠ΅ΡΠ΅Ρ
Π²Π°ΡΡΠ²Π°ΡΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠΌ, Π΄Π°ΠΆΠ΅ Π²Π½ΡΡΡΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² @Configuration
(ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΡΠ°Π½Π΅Π΅ Π² ΡΡΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅), ΠΈΠ·-Π·Π° ΡΠ΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ: ΠΠΎΠ΄ΠΊΠ»Π°ΡΡΡ CGLIB ΠΌΠΎΠ³ΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ. ΠΠ°ΠΊ ΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅, ΠΏΡΡΠΌΠΎΠΉ Π²ΡΠ·ΠΎΠ² Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° @Bean
ΠΈΠΌΠ΅Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΡ Java, Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΡΠ΅Π³ΠΎ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΏΡΡΠΌΠΎ ΠΈΠ· ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π°.
ΠΠΈΠ΄ΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
Π½Π° ΡΠ·ΡΠΊΠ΅ Java Π½Π΅ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ Π²Π»ΠΈΡΠ½ΠΈΡ Π½Π° ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Spring. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡ ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ°Ρ
, Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΠΈΡ
ΡΡ ΠΊ @Configuration
, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ @Bean
Π² ΠΊΠ»Π°ΡΡΠ°Ρ
@Configuration
Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠΌΠΈ, ΡΠΎ Π΅ΡΡΡ, ΠΎΠ½ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΠΊΠ°ΠΊ private
ΠΈΠ»ΠΈ final
.
ΠΠ΅ΡΠΎΠ΄Ρ @Bean
ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π±Π°Π·ΠΎΠ²ΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ² Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π½Π° Java 8 ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΡ
Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°Ρ
, ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΊΠΎ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΈΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ, ΠΏΡΠΈ ΡΡΠΎΠΌ Π΄Π°ΠΆΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅ΡΠΎΠ΄Ρ Java 8 ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π²Π΅ΡΡΠΈΠΈ Spring 4.2.
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΎΠ΄ΠΈΠ½ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ Π±ΠΈΠ½Π° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
ΡΠ°Π±ΡΠΈΡΠ½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΎ ΡΠΎΡ ΠΆΠ΅ Π°Π»Π³ΠΎΡΠΈΡΠΌ, ΡΡΠΎ ΠΈ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ ΡΠ°ΠΌΠΎΠ³ΠΎ "ΠΆΠ°Π΄Π½ΠΎΠ³ΠΎ" ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΈΠ»ΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π² Π΄ΡΡΠ³ΠΈΡ
ΡΡΠ΅Π½Π°ΡΠΈΡΡ
ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ: ΠΠ°ΡΠΈΠ°Π½Ρ Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΡΡΡΠΈΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π²ΡΠ±ΠΈΡΠ°Π΅Ρ ΠΌΠ΅ΠΆΠ΄Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ @Autowired
ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°ΠΌΠΈ.
ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ΠΌ
ΠΡΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, Π΅Π³ΠΎ ΠΈΠΌΡ Π±ΠΈΠ½Π° Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΠ΅ΠΉ BeanNameGenerator
, ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΉ Π΄Π°Π½Π½ΠΎΠΌΡ ΡΠΊΠ°Π½Π΅ΡΡ. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π»ΡΠ±Π°Ρ ΡΡΠ΅ΡΠ΅ΠΎΡΠΈΠΏΠ½Π°Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Spring(@Component
, @Repository
, @Service
ΠΈ @Controller
), ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ°Ρ value
ΠΈΠΌΠ΅Π½ΠΈ, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎ ΠΈΠΌΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°.
ΠΡΠ»ΠΈ ΡΠ°ΠΊΠ°Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ value
ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΠΌΠΈ ΡΠΈΠ»ΡΡΡΠ°ΠΌΠΈ), Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ ΠΈΠΌΠ΅Π½ Π±ΠΈΠ½ΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½Π΅ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° Π±Π΅Π· Π·Π°Π³Π»Π°Π²Π½ΡΡ
Π±ΡΠΊΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π±ΡΠ»ΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΠΎ ΠΈΡ
ΠΈΠΌΠ΅Π½Π° Π±ΡΠ΄ΡΡ myMovieLister
ΠΈ movieFinderImpl
:
@Service("myMovieLister")
public class SimpleMovieLister {
// ...
}
@Service("myMovieLister")
class SimpleMovieLister {
// ...
}
@Repository
public class MovieFinderImpl implements MovieFinder {
// ...
}
@Repository
class MovieFinderImpl : MovieFinder {
// ...
}
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ ΠΏΠΎΠ»Π°Π³Π°ΡΡΡΡ Π½Π° ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ Π±ΠΈΠ½ΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠ°ΡΠ΅Π³ΠΈΡ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ
, ΡΠ΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ BeanNameGenerator
ΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ Π² Π½Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΡΠ΅ΠΌ ΡΠΊΠ°ΠΆΠΈΡΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΊΠ°Π½Π΅ΡΠ°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°.
BeanNameGenerator
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠΎΠ»Π½ΠΎΠ΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ½Π°. ΠΠ°ΡΠΈΠ½Π°Ρ ΡΠΎ Spring Framework 5.2.3, Π΄Π»Ρ ΡΠ°ΠΊΠΈΡ
ΡΠ΅Π»Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ FullyQualifiedAnnotationBeanNameGenerator
, Π½Π°Ρ
ΠΎΠ΄ΡΡΠΈΠΉΡΡ Π² ΠΏΠ°ΠΊΠ΅ΡΠ΅ org.springframework.context.annotation
.@Configuration
@ComponentScan(basePackages = "org.example", nameGenerator = MyNameGenerator.class)
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"], nameGenerator = MyNameGenerator::class)
class AppConfig {
// ...
}
<beans>
<context:component-scan base-package="org.example"
name-generator="org.example.MyNameGenerator" />
</beans>
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΠΌΡ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠ΅ΠΉ Π²ΠΎ Π²ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , Π² ΠΊΠΎΡΠΎΡΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΡΠ²Π½ΠΎ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π½Π΅Π³ΠΎ. Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π΄Π»Ρ ΡΠ΅Ρ ΡΠ»ΡΡΠ°Π΅Π², ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅.
ΠΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
ΠΠ°ΠΊ ΠΈ Π² ΡΠ΅Π»ΠΎΠΌ Π² ΡΠ»ΡΡΠ°Π΅ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ, ΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌΡΠΌΠΈ Spring, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ ΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ singleton
. ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΈΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Scope
. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΈΠΌΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Π² Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder {
// ...
}
@Scope("prototype")
@Repository
class MovieFinderImpl : MovieFinder {
// ...
}
@Scope
ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π±ΠΈΠ½Π° (Π΄Π»Ρ Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²) ΠΈΠ»ΠΈ Π΄Π»Ρ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° (Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² @Bean
). Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π±ΠΈΠ½ΠΎΠ² Π½Π° XML, Π·Π΄Π΅ΡΡ Π½Π΅Ρ ΠΏΠΎΠ½ΡΡΠΈΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π±ΠΈΠ½ΠΎΠ², Π° ΠΈΠ΅ΡΠ°ΡΡ
ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΊΠ»Π°ΡΡΠΎΠ² Π½Π΅ ΠΈΠΌΠ΅ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
.ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π²Π΅Π±-ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΎΠ±Π»Π°ΡΡΡΡ
Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ "request" ΠΈΠ»ΠΈ "session" Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ Spring, ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» "ΠΠ±Π»Π°ΡΡΠΈ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ Request, Session, Application ΠΈ WebSocket". ΠΠ°ΠΊ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Ρ Π³ΠΎΡΠΎΠ²ΡΠΌΠΈ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌΠΈ Π΄Π»Ρ ΡΡΠΈΡ
ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ Spring: Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡ, ΠΌΠ΅ΡΠ°-Π°Π½Π½ΠΎΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ @Scope("prototype")
ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ°ΠΊΠΆΠ΅ ΠΎΠ±ΡΡΠ²Π»ΡΡΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ Ρ ΠΏΡΠΎΠΊΡΠΈ, Π²Ρ
ΠΎΠ΄ΡΡΠΈΠΌ Π² ΠΎΠ±Π»Π°ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ (scoped-proxy mode).
ScopeMetadataResolver
. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π±Π΅Π· Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ². ΠΠ°ΡΠ΅ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΡΠΎΡΠ½Π΅Π½Π½ΠΎΠ΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΡΠΊΠ°Π½Π΅ΡΠ°, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π±ΠΈΠ½Π°:@Configuration
@ComponentScan(basePackages = "org.example", scopeResolver = MyScopeResolver.class)
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"], scopeResolver = MyScopeResolver::class)
class AppConfig {
// ...
}
<beans>
<context:component-scan base-package="org.example" scope-resolver="org.example.MyScopeResolver"/>
</beans>
ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
Π½Π΅ Π½Π΅ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΡ
ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΠΈ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° component-scan ΠΈΠΌΠ΅Π΅ΡΡΡ Π°ΡΡΠΈΠ±ΡΡ scoped-proxy. Π’ΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΡ: no
, interfaces
ΠΈ targetClass
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ
Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΏΡΠΎΠΊΡΠΈ ΠΈΠ· JDK:
@Configuration
@ComponentScan(basePackages = "org.example", scopedProxy = ScopedProxyMode.INTERFACES)
public class AppConfig {
// ...
}
@Configuration
@ComponentScan(basePackages = ["org.example"], scopedProxy = ScopedProxyMode.INTERFACES)
class AppConfig {
// ...
}
<beans>
<context:component-scan base-package="org.example" scoped-proxy="interfaces"/>
</beans>
Π£ΠΊΠ·Π°Π½ΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ
ΠΡΠΈΠΌΠ΅ΡΡ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π΄Π΅Π»Π΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΈ @Qualifier
ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ ΡΠΎΠ½ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΏΡΠΈ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΡ Π±ΡΠ»ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Π½Ρ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ
Π±ΠΈΠ½ΠΎΠ² Π½Π° XML, ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π±ΡΠ»ΠΈ ΡΠΊΠ°Π·Π°Π½Ρ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡΡ
Π±ΠΈΠ½ΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Ρ ΠΏΠΎΠΌΠΎΡΡΡ qualifier
ΠΈΠ»ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² meta
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° bean
Π½Π° XML. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΠ΅ΡΡ Π½Π° ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ classpath Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Ρ Π°Π½Π½ΠΎΡΠ°ΡΠΈΡΠΌΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΠΊΠ»Π°ΡΡΠ°-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ°. Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΡΡΠΎΡ ΠΏΡΠΈΡΠΌ:
@Component
@Qualifier("Action")
public class ActionMovieCatalog implements MovieCatalog {
// ...
}
@Component
@Qualifier("Action")
class ActionMovieCatalog : MovieCatalog
@Component
@Genre("Action")
public class ActionMovieCatalog implements MovieCatalog {
// ...
}
@Component
@Genre("Action")
class ActionMovieCatalog : MovieCatalog {
// ...
}
@Component
@Offline
public class CachingMovieCatalog implements MovieCatalog {
// ...
}
@Component
@Offline
class CachingMovieCatalog : MovieCatalog {
// ...
}
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ²
Π₯ΠΎΡΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΡΠ΅ΠΉ ΠΊΠ»Π°ΡΡΠ° ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΊΡΠ°ΠΉΠ½Π΅ Π±ΡΡΡΡΠΎ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»ΡΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π·Π°ΠΏΡΡΠΊΠ° Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΡΠΎΠ·Π΄Π°Π² ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ. Π ΡΡΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π²ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ.
@ComponentScan
ΠΈΠ»ΠΈ <context:component-scan/>
Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π½ΡΠΌΠΈ, ΡΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ Π½Π° ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ² Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
ΠΏΠ°ΠΊΠ΅ΡΠ°Ρ
. ΠΡΠ»ΠΈ ApplicationContext
ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΠΊΠΎΠΉ ΠΈΠ½Π΄Π΅ΠΊΡ, ΠΎΠ½ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΅Π³ΠΎ, Π° Π½Π΅ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ classpath.Π§ΡΠΎΠ±Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ½Π΄Π΅ΠΊΡ, Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ ΠΌΠΎΠ΄ΡΠ»Ρ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅ΠΌΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ΅Π»ΡΠΌΠΈ Π΄Π»Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ² ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ². Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Maven:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.3.24</version>
<optional>true</optional>
</dependency>
</dependencies>
Π Gradle 4.5 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ°Π½Π½ΠΈΡ
Π²Π΅ΡΡΠΈΡΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ compileOnly
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
dependencies {
compileOnly "org.springframework:spring-context-indexer:5.3.24"
}
Π Gradle 4.6 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ
Π²Π΅ΡΡΠΈΡΡ
Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ annotationProcessor
, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
dependencies {
annotationProcessor "org.springframework:spring-context-indexer:5.3.24"
}
ΠΡΡΠ΅ΡΠ°ΠΊΡ spring-context-indexer
Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ» META-INF/spring.components
, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² jar-ΡΠ°ΠΉΠ».
spring-context-indexer
Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²-ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠ².META-INF/spring.components
Π±ΡΠ΄Π΅Ρ Π½Π°ΠΉΠ΄Π΅Π½ Π² ΠΏΡΡΠΈ ΠΊΠ»Π°ΡΡΠΎΠ². ΠΡΠ»ΠΈ ΠΈΠ½Π΄Π΅ΠΊΡ ΡΠ°ΡΡΠΈΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ (ΠΈΠ»ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ), Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΌΠΎΠΆΠ½ΠΎ Π²Π΅ΡΠ½ΡΡΡΡΡ ΠΊ ΠΎΠ±ΡΡΠ½ΠΎΠΌΡ ΡΠΈΠΏΡ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΡΠΈ ΠΊΠ»Π°ΡΡΠΎΠ² (ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΠΈΠ½Π΄Π΅ΠΊΡ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΎΡΡΡΡΡΡΠ²ΠΎΠ²Π°Π»), ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ² spring.index.ignore
Π² true
, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ JVM, Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ SpringProperties
.