ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

Π’Ρ‹Π±ΠΎΡ€ Π±ΠΈΠ½Π° для внСдрСния: @Qualifier, @Named, @Resource

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈΠ’ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… прилоТСниях, основанных Π½Π° Spring (ΠΈΠ»ΠΈ любом Π΄Ρ€ΡƒΠ³ΠΎΠΌ IoC Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ΅), ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ дСнь, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ зависимостСй образуСтся Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ: ΠΎΠ΄Π½ΠΎΠΉ зависимости удовлСтворяСт сразу нСсколько Π±ΠΈΠ½ΠΎΠ², вСдь Π²Ρ‹Π±ΠΎΡ€ производится ΠΏΠΎ совмСстимости Ρ‚ΠΈΠΏΠΎΠ² внСдряСмого ΠΈ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π±ΠΈΠ½ΠΎΠ². Π§Ρ‚ΠΎ ΠΆΠ΅ Ρ‚ΠΎΠ³Π΄Π° ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚?

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

Нам понадобится ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΉ пустой maven ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Spring ΠΈ JUnit:

Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ создадим интСрфСйс ΠΈ Π΄Π²Π΅ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

НСоднозначныС Π±ΠΈΠ½Ρ‹

Для Π½Π°Ρ‡Π°Π»Π° я Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π» ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΆΡ‘ всё Ρ‚Π°ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ объявим конкурс Β«Π”Π²Π° Π±ΠΈΠ½Π° Π½Π° ΠΎΠ΄Π½ΠΎ мСсто» 🙂 ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Spring ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ нСсколько Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ для связывания зависимостСй, я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… всС:

Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π΅Π½:

И тСстовый класс ΠΊ Π½Π΅ΠΌΡƒ. Π’Π°ΠΊ ΠΊΠ°ΠΊ тСсты ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π° ΠΈ ΠΈΠΌΠ΅Π½Π΅ΠΌ тСстируСмого класса, достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ лишь ΠΎΠ΄ΠΈΠ½:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ прСдсказуСм:

НСявный Π²Ρ‹Π±ΠΎΡ€ Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

Одно ΠΈΠ· самых простых Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, это Π½Π°ΠΌΠ΅ΠΊΠ½ΡƒΡ‚ΡŒ Spring’у, ΠΊΠ°ΠΊΠΎΠΉ Π±ΠΈΠ½ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠΎΠ»Π΅ΠΉ.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΠ½ Π² Spring context ΠΈΠΌΠ΅Π΅Ρ‚ своё имя. Π­Ρ‚ΠΎ ΠΈΠΌΠ΅ пороТдаСтся Π»ΠΈΠ±ΠΎ ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ класса, Π»ΠΈΠ±ΠΎ явно задаётся Π² xml ΠΈ grovvy ΠΊΠΎΠ½Ρ„ΠΈΠ³Π°Ρ…, Π»ΠΈΠ±ΠΎ бСрётся ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создания Π±ΠΈΠ½Π° Π² java config.

Если ΠΌΡ‹ Π½Π°Π·ΠΎΠ²Ρ‘ΠΌ ΠΏΠΎΠ»Π΅ с Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ½Π°, Spring смоТСт ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ Π²Ρ‹Π±ΠΎΡ€:

НСявноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со всСми аннотациями:

Π―Π²Π½ΠΎΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π»ΡŽΠ±ΠΈΡ‚ β€˜convention-over-configuration’, Π² Spring Π΅ΡΡ‚ΡŒ аннотация @Qualifier, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ явно Π·Π°Π΄Π°Ρ‚ΡŒ имя Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°:

ВСсты ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ самыми ΠΈ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ проходят:

@Qualifier ΠΈ Π·Π°Π΄Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π° ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ

Для использования этой Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π²Π½Π°Ρ‡Π°Π»Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°:

И ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ эту Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΈ ΠΊ классу Π±ΠΈΠ½Π° ΠΈ ΠΊ зависимости:

@Named ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΉ способ указания Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

JSR-330 ΠΏΠΎΠΌΠΈΠΌΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ @Qualifier принёс ΠΈ Π°Π½Π°Π»ΠΎΠ³ старого, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся @Named ΠΈ Π²Π΅Π΄Ρ‘Ρ‚ сСбя Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

@Resource ΠΈ всё Π΅Ρ‰Ρ‘ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

ΠΡƒΠΆΠ½ΠΎβ€¦Π±ΠΎΠ»ΡŒΡˆΠ΅β€¦Π±ΠΈΠ½ΠΎΠ²β€¦

На случай, Ссли Π½ΡƒΠΆΠ½Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ всС Π±ΠΈΠ½Ρ‹ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ имя Π±ΠΈΠ½Π° нСизвСстно, ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ:

ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ внСдрСния Π±ΠΈΠ½ΠΎΠ² Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½. Π’Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Π±ΠΈΠ½ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ со всСми аннотациями.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ спСциализациСй Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ упираСтся Π² вопрос удобства ΠΈ бСзопасности. БпСциализация ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ, с @Qualified ΠΈΠ· JSR-330 ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ связываСт Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ Π±ΠΈΠ½ с Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ достаточно ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. БпСциализация ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ Π²ΠΎΠΎΠ±Ρ‰Π΅, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, Ссли имя Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚ΠΎ ΠΈΠ»ΠΈ Π½Π΅ Ρƒ Ρ‚ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°.

Код ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° доступСн Π½Π° github. ВСсты модуля fail ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ оставлСны ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ.

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

РусскиС Π‘Π»ΠΎΠ³ΠΈ

Spring @Autowired ΠΈ Ρ‚Ρ€ΠΈ способа Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ автоматичСскоС сканированиС

ΠŸΡ€Π΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅:

@Autowired ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ рСализуСтся с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° set ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса. ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired, сначала ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ здСсь Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired.

1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² сцСнарии использования Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ @Autowired

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, основная Ρ‡Π°ΡΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Autowired

ЀактичСски, ΠΊΠΎΠ³Π΄Π° запускаСтся Spring IoC, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ автоматичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ постпроцСссор AutowiredAnnotationBeanPostProcessor. Когда ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ сканируСт @Autowied, @Resource ΠΈΠ»ΠΈ @Inject, ΠΎΠ½ автоматичСски Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ IoC ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ Π΅Π³ΠΎ со свойствами ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ΠŸΡ€ΠΈ использовании @Autowired сначала запроситС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ‚ΠΈΠΏ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅,

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹ΠΉ процСсс ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ аннотация @Autowired вводится Π² соотвСтствии с Ρ‚ΠΈΠΏΠΎΠΌ сборки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ зависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сущСствовал. Если Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для Π΅Π³ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ @ ΠšΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ вмСстС;

3. УстранитС Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ автоматичСской сборки с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Autowired.

Если Π² процСссС использования Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ @Autowired Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ NoUniqueBeanDefinitionException, это Π² основном связано с Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ, Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΉ автоматичСской сборкой ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сборки. Π’ΠΎ Π΅ΡΡ‚ΡŒ сущСствуСт Π±ΠΎΠ»Π΅Π΅ Π΄Π²ΡƒΡ… классов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для интСрфСйса. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎ врСмя автоматичСской сборки ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ тяТСлая ситуация. NoUniqueBeanDefinitionException Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΈ.

@Autowired собираСтся ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ, поэтому Ρƒ мСня Π΅ΡΡ‚ΡŒ интСрфСйс UserInterface с нСсколькими классами Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, эти классы Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Spring, ΠΊΠΎΠ³Π΄Π° Π² классС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€:

НиТС пСрСчислСны Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ нСоднозначности сборки.

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

Π’ настоящСС врСмя, Ссли имССтся ссылка Π½Π° Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ класса Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйса IUserService, сначала внСдряСтся класс Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Promary, Π½ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сущСствуСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°. Π’ классС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ интСрфСйса Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ @Primary Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·. Если для AImpl Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ @primary, Ρ‚Π°ΠΊ ΠΈ BImpl, ΠΈ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ сборки ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ.Π’ настоящСС врСмя рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ (1) для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ нСоднозначности.

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ

Π’ послСднСм случаС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², Π½ΠΎ такая ситуация Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ€Π΅Π΄ΠΊΠΎ, поэтому я Π½Π΅ Π±ΡƒΠ΄Ρƒ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π΅ снова, ΠΈ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Baidu ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’-Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹Ρ…, ΠΊΠ°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Spring обСспСчиваСт автоматичСская сборка?

Spring Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ сборку с Π΄Π²ΡƒΡ… Ρ‚ΠΎΡ‡Π΅ΠΊ зрСния:

ΠšΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡ сканирования ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ автоматичСской сборки ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΡ‰Π½ΠΎΠΉ, ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ вашСго дисплСя.

Π’-пятых, Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ @Autowired ΠΈ @Resource

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ пСрСчислСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Ρ‰ΠΈΠ΅ повСрхностныС различия ΠΌΠ΅ΠΆΠ΄Ρƒ @Autowired ΠΈ @Resource.Π§Ρ‚ΠΎ касаСтся ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ различия, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Autowired Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Spring ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Resource Π² Java.

(1) @Autowired внСдряСтся Π² соотвСтствии со сборкой Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для этого трСбуСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ зависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ сущСствовал. Если Π΅ΠΌΡƒ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для Π΅Π³ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ @Qualifier ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСстС;

(2) @Resource ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ собираСт ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡŽ Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ.Волько ΠΊΠΎΠ³Π΄Π° Π½Π΅ удаСтся Π½Π°ΠΉΡ‚ΠΈ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΈ, ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΡ собираСтся Π² соотвСтствии с Ρ‚ΠΈΠΏΠΎΠΌ;

(3) аннотация @Resource прСдоставляСтся J2EE, Π° @Autowired прСдоставляСтся Spring, поэтому для ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ зависимости систСмы ΠΎΡ‚ Spring рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ @Resource;

(4) И @Resource, ΠΈ @Autowired ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ записаны ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π² ΠΏΠΎΠ»Π΅ ΠΈΠ»ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ установки поля.

(5) @Resource собираСтся Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Когда bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠΌΠ΅Π½ΠΈ, Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ собран Π² соотвСтствии с Ρ‚ΠΈΠΏΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° name. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΊΠΎΠ³Π΄Π° аннотация ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π° Π² ΠΏΠΎΠ»Π΅, ΠΏΠΎΠ»Π΅ бСрСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Имя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для поиска зависимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.Когда аннотация ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π° Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ установки Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°, имя Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для поиска зависимого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Ссли Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠΌΠ΅Π½ΠΈ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½, ΠΈ зависимый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Π² соотвСтствии с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π’ это врСмя ΠΎΠ½ вСрнСтся ΠΊ сборкС ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ, Π½ΠΎ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ name Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ.

Π’-ΡˆΠ΅ΡΡ‚Ρ‹Ρ…, ΠΊΠ°ΠΊ Spring запускаСт автоматичСскоС сканированиС

Π’ΠΎΡ‚ Ρ‚Ρ€ΠΈ способа Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ автоматичСскоС сканированиС.

ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ:Π’ этом случаС, для Π±ΠΎΠ»Π΅Π΅ особой ситуации, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ SpringBoot, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @SpringBootApplication для запуска Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ автоматичСского сканирования.

ΠŸΡƒΡ‚ΡŒ Π²Ρ‚ΠΎΡ€ΠΎΠΉ: Π’ Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ XML запуститС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ автоматичСского сканирования. Π Π΅ΠΆΠΈΠΌ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ XML.

Π’Π΅Π³ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ автоматичСскоС сканированиС Spring Beans ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ base-package, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Spring Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС классы, ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½Π½Ρ‹Π΅ @Component Π² этом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΈΡ….

ΠŸΡƒΡ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° настройки Java запуститС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ автоматичСского сканирования.

Π’ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

(2) @ComponentScan ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ сканирования Spring Beans, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ XML, здСсь Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ basePackages. Π§Ρ‚ΠΎΠ±Ρ‹

Если аннотация @ComponentScan Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ значСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ значСния Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌ здСсь, Ссли Π½Π΅Ρ‚, аннотация @ComponentScan Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ с Ρ‚Π΅ΠΌ ΠΆΠ΅ классом ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π§Ρ‚ΠΎ касаСтся использования Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ @Repository, @Service, @Controller ΠΈ @Component
На ΡƒΡ€ΠΎΠ²Π½Π΅ сохраняСмости, бизнСс-ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈ ΡƒΡ€ΠΎΠ²Π½Π΅ управлСния @Repository, @Service ΠΈ @Controller ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для аннотирования классов Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅, Π° @Component ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для аннотирования Π±ΠΎΠ»Π΅Π΅ Π½Π΅ΠΉΡ‚Ρ€Π°Π»ΡŒΠ½Ρ‹Ρ… классов. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ этот класс ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Spring для управлСния, Π° имя ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΎ Π² userManager.ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ ΡƒΡ€ΠΎΠ²Π½ΡŽ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ этот класс, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ @Component.

БСмь, сколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сборки сущСствуСт Π² Spring?

Π’ настоящСС врСмя Π² Spring Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° сборки:

8. ИспользованиС @Autowired Π² @Configuration для аннотирования ошибок IDE.

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈΠ·Π°Π³Π»Π°Π²ΠΈΠ΅

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

Аннотация @Autowired: Ρ‡Ρ‚ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ?

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

РСшил Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired. ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‡Π΅Π½ΡŒ прост.

Допустим Ρƒ нас Π΅ΡΡ‚ΡŒ bean-зависимости:

И Π΅ΡΡ‚ΡŒ класс сСрвиса:

И ΠΏΡ€ΠΈ создании контСкста Spring автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚, Ρ‡Ρ‚ΠΎ для создания MyService трСбуСтся bean Ρ‚ΠΈΠΏΠ° ServiceDependency (ΠΈΠ»ΠΈ наслСдник), Π½Π°ΠΉΠ΄Ρ‘Ρ‚ Π΅Π³ΠΎ Ρƒ сСбя, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… подставит Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ServiceDependencyImpl Π² bean MyService.

На самом Π΄Π΅Π»Π΅, начиная со Spring 4.0 Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Autowired ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° конструктор, Ссли ΠΎΠ½ СдинствСнный Π² классС.

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ использования Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

@Autowired ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ нСпосрСдствСнно Π½Π° ΠΏΠΎΠ»Π΅. Π”Π°-Π΄Π°, это Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ с private-полями:

Π’Π°ΠΊΠΆΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° сСттСры:

Но ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘?

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ½ΠΎΠ² Ρ‚ΠΈΠΏΠ° ServiceDependency нСсколько (допустим dependency1 ΠΈ dependency2). Π’ΠΎΠ³Π΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ bean, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Qualifier:

А Ссли ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Π±ΠΈΠ½Ρ‹?

Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ простым способом:

И Spring вставит (ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) всС Π±ΠΈΠ½Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ интСрфСйс ServiceDependency. Π’ΠΎ ΠΆΠ΅ самоС Π²Π΅Ρ€Π½ΠΎ ΠΈ для Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΉ. Как Π½ΠΈ странно, Π½ΠΎ порядком слСдования Π² этой ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Order.

Но самоС Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, Π²ΠΎΡ‚ это:

Spring автоматичСски подставит Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сами Π±ΠΈΠ½Ρ‹, Π½ΠΎ ΠΈ ΠΈΠΌΠ΅Π½Π° Π±ΠΈΠ½ΠΎΠ² Π² качСствС ΠΊΠ»ΡŽΡ‡Π΅ΠΉ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ эффСктивно использовано, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π΅ «стратСгия».

Π•ΡΡ‚ΡŒ вопрос? ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π² коммСнтариях!

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

ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Spring Professional Certification. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, IoC, Π±ΠΈΠ½Ρ‹

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток, Π₯Π°Π±Ρ€.

БСгодня я Ρ€Π΅ΡˆΠΈΠ» ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π°ΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ†ΠΈΠΊΠ»Π° статСй для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ Spring Professional Certification.

Π­Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Ссли ΠΎΠ½ Π·Π°ΠΉΠ΄Π΅Ρ‚ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, я ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΡƒ выпуск ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ².

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

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

Π’ Spring Framework интСрфСйс org.springframework.factory.BeanFactory прСдоставляСт Ρ„Π°Π±Ρ€ΠΈΠΊΡƒ для Π±ΠΈΠ½ΠΎΠ², которая Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя являСтся IoC ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ прилоТСния. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΠΈΠ½Π°ΠΌΠΈ основано Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ(java ΠΈΠ»ΠΈ xml).

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ org.springframework.context.ApplicationContext β€” это ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Π½Π°Π΄ bean factory, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ AOP, Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, i18n, ΠΈ Ρ‚.ΠΏ.

Основа Spring Framework β€” ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€, ΠΈ наши ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ «ΠΆΠΈΠ²ΡƒΡ‚» Π² этом ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.
ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ создаСт мноТСство ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° основС ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ ΠΈ управляСт ΠΈΡ… ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΎΡ‚ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎ уничтоТСния.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс ApplicationContext.

Spring обСспСчиваСт нСсколько разновидностСй контСкста.

Π•ΡΡ‚ΡŒ нСсколько основных Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ интСрфСйса ApplicationContext:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ создания контСкста:

Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ JUnit 5, Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ 2 Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ:

Если это Π½Π΅ Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ 2 способа:

Π’ Spring Boot ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:

Π­Ρ‚ΠΎΡ‚ класс помСстит Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ экзСмпляр класса DataSource. ПозднСС Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ доступС ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ….

Component scanning(сканированиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²) β€” Spring автоматичСски ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π±ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π­Ρ‚ΠΎ Π±ΠΈΠ½Ρ‹ с аннотациями-стСрСотипами.

ComponentΠšΠΎΡ€Π½Π΅Π²Π°Ρ аннотация, которая ΠΏΠΎΠΌΠ΅Ρ‡Π°Π΅Ρ‚ класс ΠΊΠ°ΠΊ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ для автовнСдрСния
ControllerΠ£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс являСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ для отправлСния Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚.
@RestControllerΠ£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс являСтся ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠΌ для REST.
Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Controller ΠΈ @ResponseBody
ServiceΠ£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс являСтся сСрвисом для выполнСния бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΈ
RepositoryΠ£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс являСтся Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π΄
@ConfigurationΠ£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ класс содСрТит Java-ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ(@Bean-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹)

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” scope, скоуп. БущСствуСт 2 области видимости ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

SingletonΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ находится всСго 1 экзСмпляр Π±ΠΈΠ½Π°
PrototypeΠ’ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ находится любоС количСство экзСмпляров Π±ΠΈΠ½Π°

И 4 области видимости Π² Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

RequestΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” 1 HTTP запрос. На ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запрос создаСтся Π½ΠΎΠ²Ρ‹ΠΉ Π±ΠΈΠ½
SessionΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” 1 сСссия. На ΠΊΠ°ΠΆΠ΄ΡƒΡŽ сСссию создаСтся Π½ΠΎΠ²Ρ‹ΠΉ Π±ΠΈΠ½
ApplicationΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ServletContext
WebSocketΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости β€” ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» WebSocket

ΠžΠ±Π»Π°ΡΡ‚ΡŒ видимости указываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ @Scope Π½Π° @Bean ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ….

Prototype Scope Π½Π΅ потокбСзопасный, Ρ‚.ΠΊ. ΠΎΠ½ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ экзСмпляр Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² 1 ΠΏΠΎΡ‚ΠΎΠΊΠ΅.

Singleton Scope ΠΆΠ΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ потокобСзопасный.

Singleton-Π±ΠΈΠ½Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ сразу ΠΏΡ€ΠΈ сканировании.
Prototype-Π±ΠΈΠ½Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС запроса.

Singleton bean ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Π² любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π±ΠΈΠ½.

Prototype ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ для любого Π±ΠΈΠ½Π°.
Π’Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ singleton ΠΈΠ»ΠΈ prototype.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ кастомный BFPP. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ получСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΌΠ΅Ρ‚Π°Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ. Π€ΠΎΡ‚ΠΎ ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ autowire Π΅ΡΡ‚ΡŒ Π² spring ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ

Π•ΡΡ‚ΡŒ 3 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° для создания Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²:

НиТС пСрСчислСны Ρ‚ΠΈΠΏΡ‹ DI, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ Π² вашСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ:

DI Ρ‡Π΅Ρ€Π΅Π· конструктор считаСтся самым Π»ΡƒΡ‡ΡˆΠΈΠΌ способом, Ρ‚.ΠΊ. для Π½Π΅Π³ΠΎ Π½Π΅ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Ρ„Π»Π΅ΠΊΡΠΈΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ нСдостатков DI Ρ‡Π΅Ρ€Π΅Π· сСттСр.
DI Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΠ»Π΅ Π½Π΅ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‚.ΠΊ. для этого примСняСтся рСфлСксия, ΡΠ½ΠΈΠΆΠ°ΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
DI Ρ‡Π΅Ρ€Π΅Π· конструктор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊ цикличСским зависимостям. Π§Ρ‚ΠΎΠ±Ρ‹ этого ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π±ΠΈΠ½ΠΎΠ² ΠΈΠ»ΠΈ DI Ρ‡Π΅Ρ€Π΅Π· сСттСр.

ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ DI с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AutowiredAnnotationBeanPostProcessor. Π’ связи с этим, аннотация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована Π½ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ BeanFactoryPP ΠΈΠ»ΠΈ BeanPP.

Если внСдряСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ массив, коллСкция, ΠΈΠ»ΠΈ map с Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΎΠΌ, Ρ‚ΠΎ Spring Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ всС Π±ΠΈΠ½Ρ‹ подходящиС ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Π² этот массив(ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…). Π’ случаС с map ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ имя Π±ΠΈΠ½Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ внСдрСния:

Spring прСдоставляСт Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Qualifier, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ нСоднозначности ΠΏΡ€ΠΈ DI.

Если Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π΅ΡΡ‚ΡŒ нСсколько Π±ΠΈΠ½ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°(SomeClass), Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΡ‚ Π±ΠΈΠ½, Π½Π°Π΄ @Bean-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ стоит ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄, Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя Π±ΠΈΠ½Π° Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΊΠ²Π°Π»ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.
Имя Π±ΠΈΠ½Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Bean, Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ это имя Ρ„Π°Π±Ρ€ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

ΠŸΡ€ΠΎΠΊΡΠΈ это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΊ ΠΈ Π±ΠΈΠ½, Π½ΠΎ Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.
Π”Π²Π° Π²ΠΈΠ΄Π° прокси:

Если Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅ Π½Π΅Ρ‚ экзСмпляра Π±ΠΈΠ½Π°, Ρ‚ΠΎ вызываСтся @Bean-ΠΌΠ΅Ρ‚ΠΎΠ΄. Если экзСмпляр Π±ΠΈΠ½Π° Π΅ΡΡ‚ΡŒ, Ρ‚ΠΎ возвращаСтся ΡƒΠΆΠ΅ созданный Π±ΠΈΠ½.

Π’ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π½Π΅Π΄Ρ€Π΅Π½Π° строка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ· property ΠΈΠ»ΠΈ ΠΈΠ· view.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎΡΡŒΠ±Π° ΠΏΡ€ΠΈΡΡ‹Π»Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ ошибки Π² Π»ΠΈΡ‡ΠΊΡƒ.

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

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² Spring, ΠΈΠ»ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли ΠΏΠΎ всСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ @Autowired ΠΈ @Component, Π° Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ это

ΠŸΡ€ΠΈΠ²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽ тСбя, Π₯Π°Π±Ρ€!

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ ΡƒΠΆΠ΅ Π½Π°Ρ‡Π°Π» ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Java ΠΈ Π΄Π°ΠΆΠ΅ успСл Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… успСхов Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Java Core, ΠΈ Π²ΠΎΡ‚ ΡƒΡΠ»Ρ‹ΡˆΠ°Π» слово Spring. И, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·: Π·Π½Π°Π½ΠΈΠ΅ Spring Framework, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π² описаниях мноТСства вакансий для дТавистов. Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π²Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π½Π° ΡΠ°ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΡΡ‚ΡƒΠΏΠ΅Π½ΡŒΠΊΡƒ: ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ идСю ΡΡ‚ΠΎΠ»ΡŒ популярного Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°.

НачнСм ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ°. БущСствуСт Ρ‚Π°ΠΊΠΎΠ΅ понятиС ΠΊΠ°ΠΊ Inversion of Control, ΠΏΠΎ-русски – Π˜Π½Π²Π΅Ρ€ΡΠΈΡ управлСния, сокращСнно – IoC. IoC β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ², ΠΏΡ€ΠΈΠ±Π»ΠΈΠΆΠ°ΡŽΡ‰ΠΈΠΉ наш ΠΊΠΎΠ΄ ΠΊ слабосвязанности. IoC β€” это Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ части Π½Π°ΡˆΠΈΡ… обязанностСй Π²Π½Π΅ΡˆΠ½Π΅ΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ IoC ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, нас интСрСсуСт ΠΎΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ… β€” Dependency Injection, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй. Π§Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅, Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ само Π·Π° сСбя, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π΅Π΅ я ΠΏΠΎΡΡ‚Π°Ρ€Π°ΡŽΡΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠœΡ‹ пишСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ сСти ΠΌΠ°Π³Π°Π·ΠΈΠ½ΠΎΠ². Π•ΡΡ‚ΡŒ классы Shop (ΠΌΠ°Π³Π°Π·ΠΈΠ½) ΠΈ Seller (ΠΏΡ€ΠΎΠ΄Π°Π²Π΅Ρ†). Π£ класса Seller имССтся ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° Shop β€” ΠΌΠ°Π³Π°Π·ΠΈΠ½, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ΄Π°Π²Π΅Ρ†. Π’ΠΎΡ‚ ΠΌΡ‹ ΠΈ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ: Seller зависит ΠΎΡ‚ Shop. Π’Π΅ΠΏΠ΅Ρ€ΡŒ задумаСмся, ΠΊΠ°ΠΊ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Seller ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Shop? Π•ΡΡ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹:

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Π΅ Π΄Π²Π° способа β€” это рСализация Dependency Injection (Π½ΠΎ ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ это Π½Π΅ IoC). И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΌΡ‹ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ ΠΊ спрингу: ΠΎΠ½ прСдоставляСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ способ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости (Π° Ρ‚ΡƒΡ‚ ΡƒΠΆΠ΅ IoC).

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, Spring β€” это ΠΎΡ‡Π΅Π½ΡŒ ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π½Π°Π±ΠΎΡ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ случаи ΠΆΠΈΠ·Π½ΠΈ. БущСствуСт ΠΈ Spring MVC для быстрого создания Π²Π΅Π±-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ Spring Security для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΈ Spring Data для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΅Ρ‰Π΅ ΠΊΡƒΡ‡Π° всСго. Но ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ стоит Spring IoC β€” это Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²ΠΈΠ΄ спринга, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΈΠ·ΡƒΡ‡Π°Π΅ΠΌΡƒΡŽ Π½Π°ΠΌΠΈ Ρ‚Π΅ΠΌΡƒ β€” Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй. Spring IoC заслуТиваСт внимания Π² самом Π½Π°Ρ‡Π°Π»Π΅ изучСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ спринга ΠΏΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅. Как Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π² процСссС практичСской Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ спринга, для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… спрингов Spring IoC ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ каркас.

Знакомство со Spring IoC Π½Π°Ρ‡Π½Π΅ΠΌ с Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°: Π±ΠΈΠ½ (Π°Π½Π³Π». β€” bean). Π‘Π°ΠΌΡ‹ΠΌΠΈ простыми словами,

Π‘ΠΈΠ½ β€” создаваСмый Spring-ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Π² качСствС значСния поля Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π‘ΠΈΠ½ β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ элСмСнт с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ бизнСс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π»ΠΈΠ±ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Spring’Π°, ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ управляСт ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π±ΠΈΠ½ΠΎΠ².

Как Π²Ρ‹ ΡƒΠΆΠ΅ поняли, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Seller ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ Shop, Shop Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΡ‚Π°Ρ‚ΡŒ Π±ΠΈΠ½ΠΎΠΌ. БущСствуСт нСсколько способов Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ Π³ΠΎΡ€Π΄ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΎ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π±ΠΈΠ½Π°ΠΌΠΈ, всС ΠΎΠ½ΠΈ приводят нас ΠΊ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ ApplicationContext. ApplicationContext β€” это сСрдцС спринга. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΎΠ½ создаСтся Π² самом Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния («поднимаСтся») ΠΈ управляСт ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΌ Ρ†ΠΈΠΊΠ»ΠΎΠΌ Π±ΠΈΠ½ΠΎΠ². ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΅Π³ΠΎ Π΅Ρ‰Π΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Π±ΠΈΠ½ΠΎΠ².

ΠŸΠΎΠ΄Π±ΠΈΡ€Π°Π΅ΠΌΡΡ ΠΊ Π³Π»Π°Π²Π½ΠΎΠΌΡƒ. Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ наши классы, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Spring IoC ΠΈ Π΅Π³ΠΎ слуга ApplicationContext подставили Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ поля Shop ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Seller? Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ:

ΠŸΡ€ΠΎΡΡ‚ΠΎ? ΠšΡƒΠ΄Π° ΡƒΠΆ ΠΏΡ€ΠΎΡ‰Π΅! Π­Π»Π΅Π³Π°Π½Ρ‚Π½ΠΎ? Π’ΠΏΠΎΠ»Π½Π΅. Π—Π΄Π΅ΡΡŒ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅: аннотация Component сказала спрингу, Ρ‡Ρ‚ΠΎ класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΠΉ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ, это Π±ΠΈΠ½. Аннотация Autowired попросила Spring Π² ΠΏΠΎΠ»Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½Π° Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚Π° опСрация называСтся Β«ΠΈΠ½ΠΆΠ΅ΠΊΡ‚Π½ΡƒΡ‚ΡŒΒ» (inject). КакоС ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ подставлСно? Об этом Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅, сначала разбСрСмся, ΠΊΠ°ΠΊ Π²ΠΎΠΎΠ±Ρ‰Π΅ классы становятся Π±ΠΈΠ½Π°ΠΌΠΈ.

ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒΡΡ Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΡŒ всСх Π±ΠΈΠ½ΠΎΠ² ApplicationContext. Он-Ρ‚ΠΎ ΠΈ создаСт сразу всС Π±ΠΈΠ½Ρ‹. ΠŸΠΎΡ‡Ρ‚ΠΈ всС. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ любой Π±ΠΈΠ½ ΠΈΠΌΠ΅Π΅Ρ‚ внутриспринговоС свойство scope Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ singleton. ВнутриспринговоС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ синглтоном Π² прямом смыслС слова ΠΎΠ½ Π½Π΅ являСтся. Он являСтся синглтоном для спринга: ΠΏΡ€ΠΈ поднятии контСкста Spring создаст Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-Π±ΠΈΠ½ ΠΈΠ· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ класса. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β€” поТалуйста, Spring Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ создания Π±ΠΈΠ½Π° ΠΈ ΠΈΡ… количСством для ΠΎΠ΄Π½ΠΎΠ³ΠΎ класса, Π½ΠΎ сСйчас Π½Π΅ ΠΎΠ± этом.

Π˜Ρ‚Π°ΠΊ, ΠΏΡ€ΠΈ поднятии ApplicationContext ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ всС Π±ΠΈΠ½Ρ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ выясним, Π° собствСнно Π³Π΄Π΅ ΠΆΠΈΠ²Π΅Ρ‚ контСкст ΠΈ самоС Π³Π»Π°Π²Π½ΠΎΠ΅: ΠΊΠ°ΠΊ ΠΎΠ½ опрСдСляСт, ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ… классов Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΈΠ½Ρ‹. Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² нСсколько, для простоты излоТСния ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΏΡ€ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ…: ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„Π°ΠΉΠ»Π° xml. Π’ΠΎΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’ этом Ρ„Π°ΠΉΠ»Π΅ продСмонстрирован запуск создания Π±ΠΈΠ½ΠΎΠ² двумя путями. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ, скаТСм Ρ‚Π°ΠΊ, Ρ€ΡƒΡ‡Π½ΠΎΠΉ. Π’ΠΈΠ΄ΠΈΡ‚Π΅, здСсь Π΅ΡΡ‚ΡŒ Ρ‚Π΅Π³ bean с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ класса. Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Π±ΠΈΠ½. Из всСго, Ρ‡Ρ‚ΠΎ прописано Π² этом Ρ„Π°ΠΉΠ»Π΅ с Ρ‚Π΅Π³ΠΎΠΌ bean, Π±ΡƒΠ΄ΡƒΡ‚ созданы Π±ΠΈΠ½Ρ‹.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡƒΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ многословСн. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Π½Π°Π΄ классами ΠΌΡ‹ поставили Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Component. Из всСх классов, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… этой Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, Π±ΡƒΠ΄ΡƒΡ‚ созданы Π±ΠΈΠ½Ρ‹. Благодаря этой строкС ΠΈΠ· xml-Ρ„Π°ΠΉΠ»Π°:

Она Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ спрингу: просканируй вСсь ΠΏΠ°ΠΊΠ΅Ρ‚ main ΠΈ ΠΈΠ· всСго, Π½Π°Π΄ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ аннотация Component (ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ наслСдниками Component), создай Π±ΠΈΠ½Ρ‹. ΠšΠΎΠΌΠΏΠ°ΠΊΡ‚Π½ΠΎ, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? ΠŸΡ€ΠΎΡΡ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Π² ΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… содСрТатся классы, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΠΈΠ½Ρ‹, ΠΈ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΡƒΠ΅ΠΌ эти классы.

ΠŸΠΎΠ΄Π½ΡΡ‚ΡŒ контСкст с использованиСм xml-Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строчкой ΠΊΠΎΠ΄Π°:

Π³Π΄Π΅ beans.xml β€” ΠΏΡƒΡ‚ΡŒ ΠΊ xml-Π½ΠΈΠΊΡƒ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ шла Ρ€Π΅Ρ‡ΡŒ Π²Ρ‹ΡˆΠ΅.

Π‘ созданиСм Π±ΠΈΠ½ΠΎΠ² Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ. Каким ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Spring Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΏΠΎΠ»Π΅ Shop ΠΏΡ€ΠΈ создании Seller’а? ΠŸΡ€ΠΈ поднятии контСкста создаСтся Π±ΠΈΠ½-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Shop. Π’Π°ΠΊΠΆΠ΅ создаСтся Π±ΠΈΠ½-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Seller, ΠΎΠ½ ΠΆΠ΅ Ρ‚ΠΎΠΆΠ΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ Component. Π£ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ»Π΅ Ρ‚ΠΈΠΏΠ° Shop, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Autowired. Аннотация Autowired Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ спрингу: Π² это ΠΏΠΎΠ»Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚Π½ΡƒΡ‚ΡŒ Π±ΠΈΠ½. Π’ нашСм случаС Ρƒ нас Π΅ΡΡ‚ΡŒ всСго ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, подходящий Π½Π° эту Ρ€ΠΎΠ»ΡŒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ совпадаСт с Ρ‚ΠΈΠΏΠΎΠΌ поля: это Π±ΠΈΠ½ β€” экзСмпляр класса Shop. Он ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ½ΠΆΠ΅ΠΊΡ‚Π΅Π½ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Seller, Ρ‡Ρ‚ΠΎ ΠΈ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ. Π― понимаю, сСйчас вопросики ΠΏΠΎΠ»Π΅Π·Π»ΠΈ ΠΊΠ°ΠΊ чСрвячки: Π° Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Spring Π½Π΅ Π½Π°ΠΉΠ΄Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π±ΠΈΠ½, ΠΈΠ»ΠΈ Π½Π°ΠΉΠ΄Π΅Ρ‚ нСсколько подходящих (особСнно учитывая, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΆΠ΅ΠΊΡ‚ΠΈΡ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎ интСрфСйсу, Π° Π½Π΅ ΠΏΠΎ классу). Spring ΡƒΠΌΠ΅Π½, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈ ΠΎΡ‚ нас. Нам Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈΠ±ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² систСмС Ρ€ΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ Π±ΠΈΠ½, подходящий ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Autowired, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡƒΡ‡Π°Ρ‚ΡŒ Spring дСйствиям ΠΏΡ€ΠΈ Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°Ρ… (ΠΎΠ± этом ΠΌΡ‹ сСйчас Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ, Π²Ρ‹ ΠΈ Ρ‚Π°ΠΊ устали, ΠΊΡ€Π΅ΠΏΠΈΡ‚Π΅ΡΡŒ, ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ).

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Seller – это Ρ‚ΠΎΠΆΠ΅ Π±ΠΈΠ½. Если Π±Ρ‹ ΠΎΠ½ Π±Ρ‹Π» Π½Π΅ Π±ΠΈΠ½ΠΎΠΌ, Π° создавался Ρ‡Π΅Ρ€Π΅Π· new, Ρ‚ΠΎ автоматичСски Π±Ρ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π² Π½Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΎΠΈΠ½ΠΆΠ΅ΠΊΡ‚Π½ΡƒΠ»ΠΎΡΡŒ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ сСйчас Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, Π·Π°Ρ‡Π΅ΠΌ всС эти слоТности. Но ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ нас ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΈΠ· 2 классов, Π° Π½Π° нСсколько порядков большС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ зависимостями ΡƒΠΆΠ΅ становится Π½Π΅ самой Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ сСйчас Π΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ красиво, просто ΠΈ Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎ Spring позволяСт Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ зависимости. Но ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. И всС становится ΡƒΠΆΠ΅ Π½Π΅ Ρ‚Π°ΠΊ просто…

ΠŸΠ°Ρ€ΠΎΡ‡ΠΊΠ° Ρ…ΠΈΠ½Ρ‚ΠΎΠ² напослСдок:

Π­Ρ‚ΠΎ Π»Π΅Π³Π°Π»ΡŒΠ½Ρ‹ΠΉ способ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ½, хотя Π² соврСмСнных рСалиях Ρ‚Π°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡŽΡ‚. Но для ΡƒΡ‡Π΅Π±Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ.

UPD (20.04.2021). Dependency Injection это Π½Π΅ всСгда IoC! Π’ самом Π½Π°Ρ‡Π°Π»Π΅ я ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Dependency Injection, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ IoC.

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

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

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