Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java

maestrow / repository.md

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ стал популярным благодаря DDD (Domain Driven Design). Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ Database Driven Design Π² DDD Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° начинаСтся с проСктирования бизнСс Π»ΠΎΠ³ΠΈΠΊΠΈ, принимая Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ особСнности ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚Π½ΠΎΠΉ области ΠΈ игнорируя всС, Ρ‡Ρ‚ΠΎ связано с особСнностями Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… способов хранСния Π΄Π°Π½Π½Ρ‹Ρ…. Бпособ хранСния бизнСс ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² рСализуСтся Π²ΠΎ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π½Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ созданиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° рСпозитория Π²ΠΎ всСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΎΠΉ считаСтся созданиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ бизнСс-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ»ΠΈ контСкста, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: OrdersRepository, UsersRepository, AdminRepository.

Generic Repository это Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊ вопрос: Π—Π°Ρ‡Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Ссли я ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ORM?

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, ORM позволяСт:

Однако ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ масса случаСв, ΠΊΠΎΠ³Π΄Π° Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… прСдставляСт собой Π½Π΅Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТноС ΠΈΠ»ΠΈ спСцифичноС, Ρ‡Π΅ΠΌ просто ORM. И Ρ‚ΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠΉ слой Π΄Π°Π½Π½Ρ‹Ρ… инкапсулируСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ DAL (Data Access Layer, Persistence Layer)

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: БСрия статСй by Mike Mogosanu ΠΈΠ· Π΅Π³ΠΎ Π±Π»ΠΎΠ³Π° https://blog.sapiensworks.com:

На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания этой Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ ΡΡ‚Π°Ρ‚ΡŒΠΈ Mike Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π»ΠΈΡΡŒ Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ Repository, Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Π» свой Π±Π»ΠΎΠ³ ΠΈ эти ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎΠΏΠ°Π»ΠΈ Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ Best Practces, Ρ‡Ρ‚ΠΎ ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ вопросы, выходящиС Π·Π° Ρ€Π°ΠΌΠΊΠΈ Ρ‚Π΅ΠΌΡ‹ ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½ Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠΆΡƒ здСсь ссылку Π½Π° Π²Π΅Ρ€ΡΠΈΡŽ статСй 2014 Π³ΠΎΠ΄Π°.

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

Core Data + Repository pattern. Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

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

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊ Π΅Π³ΠΎ прСимущСствам ΠΌΠΎΠΆΠ½ΠΎ отнСсти:

отсутствиС зависимостСй ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСпозитория. Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ: коллСкция Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти, UserDefaults, KeyChain, Core Data, Realm, URLCache, ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² tmp ΠΈ Ρ‚.ΠΏ.;

Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·ΠΎΠ½ отвСтствСнности. Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ выступаСт прослойкой ΠΌΠ΅ΠΆΠ΄Ρƒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ ΠΈ способом хранСния Π΄Π°Π½Π½Ρ‹Ρ…, отдСляя ΠΎΠ΄Π½ΠΎ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ;

Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ, Π±ΠΎΠ»Π΅Π΅ структурированного ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΡ‚ΠΎΠ³Π΅, всС это благоприятно сказываСтся Π½Π° скорости Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, возмоТностях ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ тСстируСмости ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ².

Π‘Π»ΠΈΠΆΠ΅ ΠΊ дСталям

Рассмотрим самый нСблагоприятный сцСнарий использования Core Data.

1. Core Data ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ большой Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с NSManagamentObject

ИдСя ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ NSManagedObject Π² качСствС Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° самая простая, Π½ΠΎ Π½Π΅ самая удачная. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ Π²ΡΡ‚Π°ΡŽΡ‚ сразу нСсколько ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ для всСх Data Provider, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°ΡΡ‚Π°Ρ‚ΡŒΡΡ с появлСниСм Π½ΠΎΠ²Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²;

Π’ Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС, Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π½Π°Ρ‡Π½Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΈ это ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠ΄ΠΈΠ½ большой нСпрСдсказуСмый magic.

2. Core Data + DB Client

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΡƒΠΌ, для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, это вынСсти Π»ΠΎΠ³ΠΈΠΊΡƒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ класс (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ DB Client), Ρ‚ΠΎΠ³Π΄Π° наш Repository Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈ Π΄ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, Π² Ρ‚ΠΎ врСмя, ΠΊΠ°ΠΊ вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ляТСт Π² DB Client. На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ javaРисунок 2

ОбС схСмы Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ β„–1. (Core Data ограничиваСтся DB Client ΠΈ Repository), ΠΈ частично ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ β„–2 ΠΈ β„–3 Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…, Π½ΠΎ Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΈΡ… ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ. ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ ΠΌΡ‹ΡΠ»ΡŒ дальшС, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ΄Ρ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ схСмС:

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ javaРисунок 3

    Core Data ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ. DB Client ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² NSManagedObject ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ;

    Repository большС Π½Π΅ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ ΠΈ ΠΎΠ½ Π½Π΅ разрастаСтся;

    Π›ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π±ΠΎΠ»Π΅Π΅ структурирована ΠΈ консолидирована

    ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

    Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‚Π°ΠΊΠΈΠΌ я Π²ΠΈΠΆΡƒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ:

    Π”ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ;

    Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° отслСТиваниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ;

    Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ;

    Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ очистки старых Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ контСкста;

    Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория;

    Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈΠ· рСпозитория;

    Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ всСх Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· рСпозитория.

    Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ваш Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΊ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ, Π½ΠΎ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ это Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚.

    К соТалСнию, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· AccessableRepository отсутствуСт, ΠΎ Ρ‡Π΅ΠΌ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ошибка Π½Π° рисункС 4:

    Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ javaРисунок 4

    Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Generic-рСализация рСпозитория, которая выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    NSObject Π½ΡƒΠΆΠ΅Π½ для взаимодСйствия с NSFetchResultController;

    FatalError ΠΈΠ³Ρ€Π°Π΅Ρ‚ Ρ€ΠΎΠ»ΡŒ прСдохранитСля, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всяк сюда входящий Π½Π΅ использовал Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ;

    Π”Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ позволяСт Π½Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

    Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ javaРисунок 5

    Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с двумя свойствами:

    ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ main Queue, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для использования NSFetchedResultsController;

    ВрСбуСтся для выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. МоТно Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° newBackgroundContext(). ΠŸΡ€ΠΎ различия Π² Ρ€Π°Π±ΠΎΡ‚Π΅ этих Π΄Π²ΡƒΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚ΡƒΡ‚.

    Π’Π°ΠΊΠΆΠ΅, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΡŽ (ΠΌΠ°ΠΏΠΈΠ½Π³) Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ рСпозитория (NSManagedObject) ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ:

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ NSManagedObject Π² Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ модСль;

    ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ NSManagedObject с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ;

    Когда-Ρ‚ΠΎ, я использовал Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² качСствС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° NSManagedObject. Π‘ ΠΎΠ΄Π½ΠΎΠΉ стороны, это Π±Ρ‹Π»ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π»ΠΎ ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ. НапримСр, ΠΊΠΎΠ³Π΄Π° использовались связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ ΠΈ ΠΎΠ΄ΠΈΠ½ NSManagedObject создавал нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… NSManagedObject. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π·ΠΌΡ‹Π²Π°Π» Π·ΠΎΠ½Ρ‹ отвСтствСнности ΠΈ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½ΠΎ сказывался Π½Π° ΠΎΠ±Ρ‰Π΅ΠΉ Π»ΠΎΠ³ΠΈΠΊΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

    Π’ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ потрСбуСтся ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Π²Π°Ρ‚ΡŒ ошибки, для этого достаточно enum:

    РСализация

    Для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ простая рСализация DBContextProvider (Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²):

    РаньшС Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ избавлял ΠΎΡ‚ ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ памяти;

    Основная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ рСпозитория выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    Cвойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с NSFetchRequest;

    Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΡ‚ΠΈΠΏΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с контСкстом, потрСбуСтся Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

    Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² persistent store;

    Если измСнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Π² completion-Π±Π»ΠΎΠΊ пСрСдаСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ошибка.

    Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ нСобходимости ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄ сохранСниСм Π½ΠΎΠ²Ρ‹Ρ… (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ контСкста);

    ВыполняСтся Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, для ΠΈΡ… дальнСйшСго измСнСния;

    Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ с Π½ΡƒΠΆΠ½Ρ‹ΠΌ entityAccessorKey отсутствуСт, создаСтся Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр NSManagedObject;

    Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΌΠ°ΠΏΠΈΠ½Π³Π° свойств ΠΈΠ· Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² NSManagedObject;

    ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.

    Π’Π°ΠΆΠ½ΠΎ: Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ вас смутил ΠΏ.2., Π΄Π°Π½Π½ΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎ Π½Π° Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€Π°Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π― выполнял Π·Π°ΠΌΠ΅Ρ€Ρ‹ (ExampleCase3 Π² Π΄Π΅ΠΌΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅) Π½Π° 10 000 записСй, iPhone 6s Plus IOS 12.4.1 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

    врСмя записи/пСрСзаписи Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ 0,9 Π΄ΠΎ 1.8 сСк, cΠΊΠ°Ρ‡ΠΎΠΊ потрСблСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² ΠΏΠΈΠΊΠ΅ Π΄ΠΎ 33 ΠΌΠ±;

    Ссли ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Π² ΠΏ2 ΠΈ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ вставку Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Ρ‚ΠΎ врСмя записи/пСрСзаписи Π΄Π°Π½Π½Ρ‹Ρ… +- 20 сСк, cΠΊΠ°Ρ‡ΠΎΠΊ потрСблСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² ΠΏΠΈΠΊΠ΅ Π΄ΠΎ 50 ΠΌΠ±.

    Для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π½Π°Π±ΠΎΡ€ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… я Π±Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ… Π½Π° части, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ batchUpdate ΠΈ batchDelete, Π° начиная с IOS 13 появился batchInsert.

    Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, рСализация ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² save cводится ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° saveIn:

    ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ present, delete, eraseAllData завязаны Π½Π° Ρ€Π°Π±ΠΎΡ‚Π΅ с NSFetchRequest. Π’ ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ особСнного, поэтому Π½Π΅ Π²ΠΈΠΆΡƒ смысла Π·Π°ΠΎΡΡ‚Ρ€ΡΡ‚ΡŒ Π½Π° Π½ΠΈΡ… Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅:

    Π’Ρ‹Π±ΠΎΡ€ΠΊΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°;

    Π’ΠΎΠ²Π·Ρ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.

    Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ возмоТности отслСТивания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, потрСбуСтся FetchedResultsController. Для Π΅Π³ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

    Π€ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ запроса, Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ измСнСния;

    Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ экзСмпляра класса NSFetchedResultsController;

    performFetch() позволяСт Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ запрос ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π΅ доТидаясь ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π±Π°Π·Π΅. НапримСр, это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ofline First;

    ИзмСнСниС свойства searchedData, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ увСдомляСт подписчиков (Ссли Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ) ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ.

    Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

    На этом этапС рСализация всСх основных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ. Для мСня основными прСимущСствами Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° стало ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

    Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ рСпозитория с Core Data стала Π²Π΅Π·Π΄Π΅ Сдиная;

    для добавлСния Π½ΠΎΠ²Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, достаточно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ EntityMapper (Π½ΠΎΠ²ΠΎΠ΅ Entity трСбуСтся ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π² любом случаС). Вся Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎ ΠΌΠ°ΠΏΠΈΠ½Π³Ρƒ свойств Ρ‚Π°ΠΊΠΆΠ΅ собрана Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС;

    Data слой стал Π±ΠΎΠ»Π΅Π΅ структурированным. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π½Π΅ выполняСт 100500 запросов Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ сохранСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ связи ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ;

    Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π»Π΅Π³ΠΊΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для тСстов, ΠΈΠ»ΠΈ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

    Бпасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅! Π›Π΅Π³ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΠ½Π³Π°, помСньшС Π±Π°Π³ΠΎΠ², побольшС Ρ„ΠΈΡ‡!

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

    Spring Data JPA

    Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΠΏΠΈΡˆΡƒ использованиС Spring Data.

    Spring Data β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для взаимодСйствия с сущностями Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡ… Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅, Π² ΠΊΠ°ΠΊΠΈΡ… Ρ‚ΠΎ случаях для этого Π±ΡƒΠ΄Π΅Ρ‚ достаточно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ интСрфСйс ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² Π½Π΅ΠΌ, Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

    1. Spring Repository

    ОсновноС понятиС Π² Spring Data β€” это Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Π­Ρ‚ΠΎ нСсколько интСрфСйсов ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ JPA Entity для взаимодСйствия с Π½Π΅ΠΉ. Π’Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ интСрфСйс
    public interface CrudRepository extends Repository
    обСспСчиваСт основныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎ поиску, сохранСния, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΡŽ Π΄Π°Π½Π½Ρ‹Ρ… (CRUD ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ)

    Π•ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ абстракции, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PagingAndSortingRepository.

    Π’.Π΅. Ссли Ρ‚ΠΎΠ³ΠΎ пСрСчня Ρ‡Ρ‚ΠΎ прСдоставляСт интСрфСйс достаточно для взаимодСйствия с ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ прямо Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ интСрфСйс для своСй сущности, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ своими ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ запросов ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. БСйчас я ΠΏΠΎΠΊΠ°ΠΆΡƒ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎ Ρ‚Π΅ шаги Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½Ρ‹ для самого простого случая (Π½Π΅ ΠΎΡ‚Π²Π»Π΅ΠΊΠ°ΡΡΡŒ ΠΏΠΎΠΊΠ° Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ORM, Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…).

    1. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ

    2. ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· интСрфСйсов Spring Data, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ CrudRepository

    3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ (сСрвисС) Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ

    Π—Π΄Π΅ΡΡŒ я воспользовался Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ findById. Π’.Π΅. Π²ΠΎΡ‚ Ρ‚Π°ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΈ быстро, Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ· CrudRepository:

    ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ Ρ‡Ρ‚ΠΎ этого пСрСчня, скорСС всСго Π½Π΅ Ρ…Π²Π°Ρ‚ΠΈΡ‚ для взаимодСйствия с ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ Ρ‚ΡƒΡ‚ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ свой интСрфСйс Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ запросов.

    2. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ запросов ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

    Запросы ΠΊ сущности ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ прямо ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ прСфиксов find…By, read…By, query…By, count…By, ΠΈ get…By, Π΄Π°Π»Π΅Π΅ ΠΎΡ‚ прСфикса ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части. Π’Π²ΠΎΠ΄Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ выраТСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Distinct. Π”Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ By дСйствуСт ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π°Ρ‡Π°Π»ΠΎ фактичСских ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠ΅Π². МоТно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ условия для свойств сущностСй ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ And ΠΈ Or. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

    Π’ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ вСсь ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ, ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° написания ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π’ качСствС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ T, Optional, List, Stream. Π’ срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Idea, Π΅ΡΡ‚ΡŒ подсказка для написания ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² запросов.

    Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ java
    Достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π±Π΅Π· ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΈ Spring ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ запрос ΠΊ сущности.

    3. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΈ настройка

    Π’Π΅ΡΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ доступСн Π½Π° github
    github DemoSpringData

    Π—Π΄Π΅ΡΡŒ лишь ΠΊΠΎΡΠ½ΡƒΡΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… особСнностСй.

    Π’ context.xml ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ Π±ΠΈΠ½Ρ‹ transactionManager, dataSource ΠΈ entityManagerFactory. Π’Π°ΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π² Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅

    ΠΏΡƒΡ‚ΡŒ Π³Π΄Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

    EntityManagerFactory настроСн Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ с Hibernate ORM, Π° ΠΎΠ½ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ с Π‘Π” Oracle XE, Ρ‚ΡƒΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, Π² context.xml всС это Π²ΠΈΠ΄Π½ΠΎ. Π’ pom Ρ„Π°ΠΉΠ»Π΅ Π΅ΡΡ‚ΡŒ всС зависимости.

    4. Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

    Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… запросов, Π² ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Pageable, Sort, Π° Ρ‚Π°ΠΊΠΆΠ΅ ограничСния Top ΠΈ First.

    5. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ для рСпозитория

    ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ Π½ΡƒΠΆΠ΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ получаСтся ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ своСго интСрфСйса ΠΈ класса Π΅Π³ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½ΠΈΠΆΠ΅ добавлю Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ получСния сотрудников с максимальной ΠΎΠΏΠ»Π°Ρ‚ΠΎΠΉ Ρ‚Ρ€ΡƒΠ΄Π°.

    Π˜ΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ интСрфСйс. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ HQL (SQL) ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ сотрудников с максимальной ΠΎΠΏΠ»Π°Ρ‚ΠΎΠΉ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

    А Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽ Crud Repository Employees Π΅Ρ‰Π΅ ΠΈ CustomizedEmployees.

    Π—Π΄Π΅ΡΡŒ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ваТная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ. Класс ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ (postfix) Π½Π° Impl, ΠΈΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свой postfix

    ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρƒ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

    Π”Ρ€ΡƒΠ³ΠΎΠΉ случай, ΠΊΠΎΠ³Π΄Π° Π½Π°Π΄ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² интСрфСйсС Spring, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ delete Π² CrudRepository, ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ Ρ‡Ρ‚ΠΎ Π±Ρ‹ вмСсто удалСния ΠΈΠ· Π‘Π”, выставлялся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ удалСния. Π’Π΅Ρ…Π½ΠΈΠΊΠ° Ρ‚ΠΎΡ‡Π½ΠΎ такая ΠΆΠ΅. НиТС ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ссли Π² employeesCrudRepository Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ delete, Ρ‚ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ.

    6. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

    Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ я ΠΏΠΎΠΊΠ°Π·Π°Π» ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ delete Π² Crud Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ сущности, Π½ΠΎ Ссли это Π½Π°Π΄ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ для всСх сущностСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π΄Π΅Π»Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ свой интСрфСйс ΠΊΠ°ΠΊ Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ. Ρ‚ΠΎΠ³Π΄Π° Π² Spring data ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ свой Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Для этого:
    ΠžΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ интСрфСйс ΠΈ Π² Π½Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ для пСрСопрСдСлСния (ΠΈΠ»ΠΈ ΠΎΠ±Ρ‰ΠΈΠΉ для всСх сущностСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°). Π’ΡƒΡ‚ я Π΅Ρ‰Π΅ для всСх своих сущностСй Π²Π²Π΅Π» свой интСрфСйс BaseEntity (это Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ), для удобства Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΠ±Ρ‰ΠΈΡ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², Π΅Π³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ сущности.

    Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ этот Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ для всСх Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Employees Repository (ΠΈ Π΄Ρ€.) Π½Π°Π΄ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΎΡ‚ BaseRepository ΠΈ ΡƒΠΆΠ΅ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

    ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ EmployeesBaseRepository

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½Π΅Π΅, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ, ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ для всСх сущностСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ интСрфСйс BaseRepository. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π» ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ поиска β€” Query by Example (QBE), я Π½Π΅ Π±ΡƒΠ΄Ρƒ здСсь Π΅Π³ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ, ΠΈΠ· ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΈΠ΄Π½ΠΎ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚, просто ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

    7. ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ запросов β€” Query

    Π Π°Π½Π΅Π΅ я писал, Ρ‡Ρ‚ΠΎ Ссли Π½ΡƒΠΆΠ΅Π½ спСцифичный ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΠ»ΠΈ Π΅Π³ΠΎ рСализация, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ нСльзя ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· имя ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Ρ‚ΠΎ это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Customized интСрфСйс ( CustomizedEmployees) ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ вычислСния. А ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡƒΡ‚Π΅ΠΌ, Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ запроса (HQL ΠΈΠ»ΠΈ SQL), ΠΊΠ°ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.
    Для ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° c getEmployeesMaxSalary, этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΎΡ‰Π΅. Π― Π΅Ρ‰Π΅ ΡƒΡΠ»ΠΎΠΆΠ½ΡŽ Π΅Π³ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ salary. Π’.Π΅. достаточно ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π² интСрфСйсС ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ запрос вычислСния.

    Упомяну лишь Π΅Ρ‰Π΅, Ρ‡Ρ‚ΠΎ запросы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅, для этого ΠΊ Π½ΠΈΠΌ добавляСтся Π΅Ρ‰Π΅ аннотация @Modifying

    Π’Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΌΠΎΠ΅ΠΌ гипотСтичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΠ½Π΅ Π½Π°Π΄ΠΎ для всСх сущностСй ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ β€œΡƒΠ΄Π°Π»Π΅Π½Β», я сдСлаю Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ интСрфСйс с ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ получСния списка ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² с ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Β«ΡƒΠ΄Π°Π»Π΅Π½Β» ΠΈΠ»ΠΈ Β«Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉΒ»

    Π”Π°Π»Π΅Π΅ всС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ для сущностСй ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ рСпозиториями, Π½ΠΎ находятся Π² Β«base-packageΒ» ΠΏΠ°ΠΏΠΊΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π½Π°Π΄ΠΎ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ @NoRepositoryBean.

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ запрос, Π² Ρ‚Π΅Π»ΠΎ запроса Π±ΡƒΠ΄Π΅Ρ‚ подставлСно имя сущности T для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ рСпозитория ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ParentEntityRepository, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Employees.

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

    Π¨Π°Π±Π»ΠΎΠ½Ρ‹ DAO ΠΏΡ€ΠΎΡ‚ΠΈΠ² рСпозитория

    ΠŸΠΎΠΉΠΌΠΈΡ‚Π΅ Ρ€Π°Π·Π½ΠΈΡ†Ρƒ ΠΌΠ΅ΠΆΠ΄Ρƒ шаблонами DAO ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅ΠΌ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Java.

    1. ΠžΠ±Π·ΠΎΡ€

    Часто Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ рСпозитория ΠΈ DAO ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ взаимозамСняСмыми, особСнно Π² прилоТСниях, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π½Π° Π΄Π°Π½Π½Ρ‹Π΅. Π­Ρ‚ΠΎ создаСт ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ Π² ΠΈΡ… различиях.

    Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ обсудим различия ΠΌΠ΅ΠΆΠ΄Ρƒ шаблонами DAO ΠΈ рСпозиториями.

    2. Π¨Π°Π±Π»ΠΎΠ½ Π”ΠΠž

    ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях наши DAO ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, позволяя Π±ΠΎΠ»Π΅Π΅ простой способ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ/извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°, скрывая ΡƒΡ€ΠΎΠ΄Π»ΠΈΠ²Ρ‹Π΅ запросы.

    Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона DAO.

    2.1. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ

    Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс User domain:

    2.2. UserDao

    2.3. UserDaoImpl

    3. Π¨Π°Π±Π»ΠΎΠ½ рСпозитория

    Богласно ΠΊΠ½ΠΈΠ³Π΅ Π­Ρ€ΠΈΠΊΠ° Эванса Domain-Driven Design , Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ” – это ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для инкапсуляции повСдСния хранСния, поиска ΠΈ поиска, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ эмулируСт ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ².”

    Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Π΅Π»ΠΎ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΈ скрываСт запросы, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ DAO. Однако ΠΎΠ½ находится Π½Π° Π±ΠΎΠ»Π΅Π΅ высоком ΡƒΡ€ΠΎΠ²Π½Π΅, Π±Π»ΠΈΠΆΠ΅ ΠΊ бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ΅ прилоТСния.

    Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ DAO для извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ заполнСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠΌΠ΅Π½Π°. Или ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² систСму хранСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ DAO для сохранСния.

    3.1. Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅

    Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим интСрфСйс UserRepository :

    3.2. UserRepositoryImpl

    Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ использовали UserDaoImpl для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ/извлСчСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

    Π”ΠΎ сих ΠΏΠΎΡ€ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ DAO ΠΈ рСпозитория выглядят ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆΠΈΠΌΠΈ, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ класс User являСтся Π°Π½Π΅ΠΌΠΈΡ‡Π½Ρ‹ΠΌ Π΄ΠΎΠΌΠ΅Π½ΠΎΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ-это просто Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ слой ΠΏΠΎΠ²Π΅Ρ€Ρ… уровня доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ (DAO).

    4. Π¨Π°Π±Π»ΠΎΠ½ РСпозитория Π‘ НСсколькими DAO

    Π§Ρ‚ΠΎΠ±Ρ‹ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ послСднСС ΡƒΡ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΈΠ΅, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠΌ наш User Π΄ΠΎΠΌΠ΅Π½ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ бизнСс-ΠΏΡ€Π΅Ρ†Π΅Π΄Π΅Π½Ρ‚Π°.

    ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… сСтях, объСдинив Π΅Π³ΠΎ Ρ‚Π²ΠΈΡ‚Ρ‹ Π² Twitter, сообщСния Π² Facebook ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.

    4.1. Π’Π²ΠΈΡ‚

    Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ создадим класс Tweet с нСсколькими свойствами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚Π²ΠΈΡ‚Π΅:

    4.2. TweetDao ΠΈ TweetDaoImpl

    Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²Π΅ΠΌ API Twitter, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС Ρ‚Π²ΠΈΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ ΠΏΠΎΡ‡Ρ‚Ρƒ.

    Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² этом случаС DAO прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ с использованиСм сторонних API.

    4.3. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΌΠ΅Π½Π° ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ

    4.4. UserRepositoryImpl

    Π—Π΄Π΅ΡΡŒ UserRepositoryImpl ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ UserDaoImpl ΠΈ Ρ‚Π²ΠΈΡ‚Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ TweetDaoImpl.

    Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ваш ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠΌΠ΅Π½, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ список сообщСний Facebook.

    5. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ рассмотрСли Π½ΡŽΠ°Π½ΡΡ‹ шаблонов DAO ΠΈ рСпозитория, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΎΠ±ΠΎΠ±Ρ‰ΠΈΠΌ ΠΈΡ… различия:

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Ρƒ нас Π΅ΡΡ‚ΡŒ Π°Π½Π΅ΠΌΠΈΡ‡Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½, Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ просто DAO.

    ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, шаблон рСпозитория поощряСт Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹ΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½, обСспСчивая Π»Π΅Π³ΠΊΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ для нСтСхничСских Ρ‡Π»Π΅Π½ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹|/.

    6. Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

    Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ исслСдовали различия ΠΌΠ΅ΠΆΠ΄Ρƒ шаблонами DAO ΠΈ рСпозиториями.

    Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΌΡ‹ рассмотрСли Π±Π°Π·ΠΎΠ²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ шаблона DAO. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ с использованиСм шаблона рСпозитория.

    НаконСц, ΠΌΡ‹ рассмотрСли Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ нСсколько DAO, Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‰ΠΈΠΉ возмоТности Π΄ΠΎΠΌΠ΅Π½Π° для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ бизнСс-Π·Π°Π΄Π°Ρ‡.

    Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ шаблон рСпозитория Π΄ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΊ бизнСс-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ.

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

    РазбираСмся, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Spring Data Repository, ΠΈ создаСм свою Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ

    На habr ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² стилС Spring Data Repository (Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΡŽ), Π½ΠΎ способы создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² довольно сильно ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ «ΠΊΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ» ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π² Spring Boot. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я постарался Π±Ρ‹Ρ‚ΡŒ максимально Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΊ этому ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Ρƒ. Π’Π°ΠΊΠΎΠΉ способ создания Π±ΠΈΠ½ΠΎΠ² (beans) примСняСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Spring Data, Π½ΠΎ ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Spring Cloud OpenFeign.

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

    Π˜Ρ‚Π°ΠΊ, Ρƒ нас ΠΏΡ€ΠΎΡˆΠ»ΠΈ ΠΏΡ€Π°Π·Π΄Π½ΠΈΠΊΠΈ, Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π° Π»Π΅Ρ‚Ρƒ Π±ΠΈΠ½Ρ‹ (beans), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΈ Π±Ρ‹ Π½Π°ΠΌ ΠΏΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡ‚ΡŒ всСх, ΠΊΠΎΠ³ΠΎ ΠΌΡ‹ Π² Π½ΠΈΡ… пСрСчислим.

    ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ:

    Π’.Π΅. ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΉΡ‚ΠΈ всС интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ интСрфСйс Congratulator ΠΈΠ»ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ @Congratulate

    @Enable

    Как ΠΈ любая взрослая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ аннотация, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ наш ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ (ΠΊΠ°ΠΊ @EnableFeignClients ΠΈ @EnableJpaRepositories ).

    НапишСм свою Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ

    ImportBeanDefinitionRegistrar

    ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ происходит Π² ImportBeanDefinitionRegistrar Ρƒ Spring Cloud Feign:

    Π’ Spring Cloud OpenFeign сначала ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π±ΠΈΠ½Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Π·Π°Ρ‚Π΅ΠΌ выполняСтся поиск ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚Π° создаСтся Factory.

    Π’ Spring Data ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Spring Data состоит ΠΈΠ· мноТСства ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Ρ‚ΠΎ основныС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹ разнСсСны ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ классам (см. Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ org.springframework.data.repository.config.RepositoryBeanDefinitionBuilder#build )

    МоТно Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ сначала ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Factory, Π° Π½Π΅ сами bean. Π­Ρ‚ΠΎ происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π² BeanDefinitionHolder ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ наш bean.

    Π‘Π΄Π΅Π»Π°Π΅ΠΌ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ наш класс (ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ класса ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь)

    ResourceLoaderAware ΠΈ EnvironmentAware ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для получСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса ResourceLoader ΠΈ Environment соотвСтствСнно. ΠŸΡ€ΠΈ создании экзСмпляра CongratulatorsRegistrar Spring Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ set-ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹.

    Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ Π½Π°ΠΌ интСрфСйсы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄:

    Π§Ρ‚ΠΎ, Ссли ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ наши beans ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ

    это Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎ врСмя создания Factory Π² качСствС alias Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ имя bean ( AnnotationBeanNameGenerator.INSTANCE.generateBeanName(candidateComponent, registry) )

    FactoryBean

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ займСмся Factory.

    Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ интСрфСйс FactoryBean ΠΈΠΌΠ΅Π΅Ρ‚ 2 ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ

    Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, являСтся Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ, Singleton ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

    Π•ΡΡ‚ΡŒ абстрактный класс ( AbstractFactoryBean ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ интСрфСйс Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° destroy-ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²). Он Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ 2 абстрактных ΠΌΠ΅Ρ‚ΠΎΠ΄Π°

    Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠΆΠ΅ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° для этого Π½ΡƒΠΆΠ½ΠΎ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ. Для этого Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ способов. Π—Π΄Π΅ΡΡŒ прСдставлСн ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ….

    Π‘Π½Π°Ρ‡Π°Π»Π° создадим ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°:

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ стартС контСкста Spring создаСт Π±ΠΈΠ½Ρ‹ (beans) Π½Π° основС Π½Π°ΡˆΠΈΡ… интСрфСйсов.

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

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

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