Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

ΠŸΡ€ΠΈΡ†Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±Π·ΠΎΡ€: Π—Π°Ρ‡Π΅ΠΌ Spring’Ρƒ Proxy ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

Π’ Spring’С Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ€ΠΎΠ΄Π½ΠΎΠΉ для ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±ΠΈΠ½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр связанного Π±ΠΈΠ½Π°. Помимо этого Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MethodReplacer β€˜a. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ здСсь.

Π­Ρ‚ΠΈ Ρ„ΠΈΡ‡ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ создания proxy ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π±ΠΈΠ½ΠΎΠ², Π° рСализуСтся всС это Π±Π΅Π·ΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ всСм извСстной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ CGLib. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ beanFactory ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ» всС ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ для создания Π±ΠΈΠ½Π° ΠΈ Π½Π΅ нашСл Π΅Π³ΠΎ Π² кСшС, Ρ‚ΠΎ ΠΎΠ½ пытаСтся Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Оба эти класса ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ SubclassCreator β€˜Π°. ΠœΠ΅Ρ‚ΠΎΠ΄ enhancer.create() конструируСт класс ΠΈ создаСт экзСмпляр ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° этого класса.

Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ beanDefintion ΠΈ beanFactory хранятся Π² полях SubclassCreator β€˜Π°, ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ Π² Π½Π΅ΠΌ классы ΠΈΠΌΠ΅ΡŽΡ‚ доступ ΠΊ Π½ΠΈΠΌ. Π­Ρ‚ΠΈ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ final, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ доступ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΊ значСниям этих ΠΏΠΎΠ»Π΅ΠΉ.

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, пСрСопрСдСляСмыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой MethodOverride ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт Π΅Π³ΠΎ имя, имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΌΠ΅Ρ‚Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅. Но сам ΠΏΠΎ сСбС этот класс абстрактный, Π° Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π΅Π³ΠΎ Π΄Π²Π° класса:

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ Ρ‚ΠΈΠΏ пСрСопрСдСляСмого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, опрСдСляСтся индСкс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ИндСкс ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π·Π°Π΄Π°Π½ Π² Π²ΠΈΠ΄Π΅ константы.

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° LookupOverrideMethodInterceptor вызываСтся созданиС Π±ΠΈΠ½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ beanFactory Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π±ΠΈΠ½Π° ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΎ Π² LookupOverride. Π­Ρ‚ΠΎ имя ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Ρ‚ΡƒΠ΄Π° ΠΈΠ· ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±ΠΈΠ½ΠΎΠ²:

ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ReplaceOverrideMethodInterceptor получаСтся ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² ReplaceOverride MethodReplacer ΠΈ вызываСтся Π΅Π³ΠΎ основной ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, ΠΊΡƒΠ΄Π° пСрСдаСтся информация ΠΎ Π²Ρ‹Π·Π²Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ… ΠΈ самом ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ MethodReplacer Ρ‚Π°ΠΊΠΆΠ΅ опрСдСляСтся Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ:

Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±Π·ΠΎΡ€Π°, ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ опСрирования ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Π±ΠΈΠ½ΠΎΠ² Π²ΠΎ всСх частях ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ достаточно большой overhead ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с proxy ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ.

Posted by Code insiders 00:01 17.07.2012 Sighting review, Spring Framework

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

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

Π’Ρ€ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° прокси прокси Java Spring

Π’Ρ€ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° прокси Java

1. АгСнтская модСль

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

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

1.1. БтатичСский прокси (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Ρ€Π΅ΠΆΠΈΠΌΡƒ Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€Π°)

ΠŸΡ€ΠΈ использовании статичСского прокси-сСрвСра Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ интСрфСйс ΠΈΠ»ΠΈ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс. ΠŸΡ€ΠΎΠΊΡΠΈ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс ΠΈΠ»ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс.

Π’ΠΎΡ‚ случай, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ:
ΠΈΠΌΠΈΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ дСйствиС сохранСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ интСрфСйс для дСйствия сохранСния: IUserDao.java, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ UserDao.java этого интСрфСйса. Π’ настоящСС врСмя, Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ статичСского прокси, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ прокси (UserDaoProxy.java) Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс IUserDao. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‹Π·Π²Π°Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.
Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ интСрфСйс, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, вызывая ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°:
Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ: IUserDao.java

Π¦Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚: UserDao.java

ВСстовый класс: App.java

БтатичСская сводка прокси:

Как ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ нСдостатки статичСского прокси? ΠžΡ‚Π²Π΅Ρ‚ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСский прокси

1.2. ДинамичСский прокси

ДинамичСский прокси, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ прокси JDK, Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ интСрфСйс, ДинамичСский прокси Jdk Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π±Π΅Π· интСрфСйса

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

API динамичСского прокси:

ΠŸΠ°ΠΊΠ΅Ρ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ располоТСн прокси-класс: java.lang.reflect.Proxy

Π’ JDK API Π΅ΡΡ‚ΡŒ прокси, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ динамичСского прокси newProxyInstance:

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ, Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ классов, Ρ‡Ρ‚ΠΎ ΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, target.getClass (). GetClassLoader ();

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹: Π’ΠΈΠΏ интСрфСйса, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΈ Ρ‚ΠΈΠΏ подтвСрТдаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. target.getClass (). getInterfaces ();

H: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° событий, ΠΊΠΎΠ³Π΄Π° выполняСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, запускаСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° событий, ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ выполняСмого Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Π½Π° основС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² динамичСского ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ прокси:

ДинамичСскиС Π°Π³Π΅Π½Ρ‚Ρ‹ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ характСристиками:

ΠΏΠΎΠ΄Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΈ:
ΠŸΡ€ΠΎΠΊΡΠΈ-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс, Π½ΠΎ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс, ΠΈΠ½Π°Ρ‡Π΅ динамичСский прокси-сСрвСр Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ

1.3. Cglib прокси (Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° основС наслСдования)

Π’Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Π΅ Ρ€Π΅ΠΆΠΈΠΌΡ‹ статичСского прокси ΠΈ динамичСского прокси Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π±Ρ‹Π» Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прСдставляСт собой просто ΠΎΠ΄ΠΈΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ интСрфСйс. Бпособ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ класс Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ прокси, называСтся этот ΠΌΠ΅Ρ‚ΠΎΠ΄: прокси Cglib

ΠŸΡ€ΠΎΠΊΡΠΈ-сСрвСр Cglib, Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ прокси подкласса, создаСт Π² памяти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ подкласса для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ прокси подкласса Cglib:

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

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси Π² Spring?

Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» icon.svg, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ соотвСтствовал Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ критСриям.

1 ΠΎΡ‚Π²Π΅Ρ‚

ΠŸΡ€ΠΎΠΊΡΠΈ, сгСнСрированный для @Transactional ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, слуТит Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ†Π΅Π»ΠΈ, Ρ‡Π΅ΠΌ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ прокси.

Π­Ρ‚ΠΈ @Transactional прокси являСтся Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Π΅Ρ€Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π±ΠΎΠ± для добавлСния повСдСния управлСния сСансами. ВсС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° выполнят ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ транзакциями ΠΏΡ€Π΅ΠΆΠ΄Π΅ ΠΈ послС дСлСгирования ΠΊ фактичСскому Π±ΠΎΠ±Ρƒ.

ΠΏΡ€ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Π³ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠ΅

@Scope прокси Π²Π΅Π΄Π΅Ρ‚ сСбя ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ. Бостояния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:

[. ] Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ интСрфСйс ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ , Π½ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΎΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ объСма (Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Запрос HTTP) ΠΈ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΄Π΅Π»Π΅Π³Π°Ρ‚Π° Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Ρ‚ΠΎ, Π§Ρ‚ΠΎ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Spring, создаСт одноэлСмСнтноС Π±ΠΎΠ±ΠΎΠ²ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для Ρ‚ΠΈΠΏΠ° Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ прокси. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ контСкст для фактичСского Π±ΠΎΠ±Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π°.

ΠΏΡ€ΠΈ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π΅Π³ΠΎ это Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠ΅

, Π’Π°ΠΊ ΠΊΠ°ΠΊ MyBeanB ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ Π±ΠΎΠ±, контСкст Π±ΡƒΠ΄Π΅Ρ‚ всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ экзСмпляр.

Π’ цСлях этого ΠΎΡ‚Π²Π΅Ρ‚Π°, ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ MyBeanB нСпосрСдствСнно с [1 144]

, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎ сущСству, Ρ‡Ρ‚ΠΎ Spring Π΄Π΅Π»Π°Π΅Ρ‚ для удовлСтворСния @Autowired инТСкционная Ρ†Π΅Π»ΡŒ.

Π’ Π’Π°ΡˆΠ΅ΠΌ ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅,

Π’Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ Π±ΠΎΠ± ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ (Ρ‡Π΅Ρ€Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ). @Scope ΠΈΠΌΠ΅Π΅Ρ‚ proxyMode элСмСнт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π±Ρ‹Ρ‚ΡŒ настроСн ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ прокси ΠΈ Ссли Ρ‚Π°ΠΊ, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»ΠΈ прокси Π±Ρ‹Ρ‚ΡŒ основан Π½Π° интСрфСйсС ΠΈΠ»ΠΈ основан Π½Π° подклассС.

, Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Spring Π½Π΅ создаСт ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ прокси для ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π±ΠΎΠ±Π°. Π’Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ‚ΠΎΡ‚ Π±ΠΎΠ± с [1 150]

, Ρƒ Вас Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΅ΡΡ‚ΡŒ ссылка Π½Π° Π½ΠΎΠ²ΠΎΠ΅ MyBeanB ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, созданный Spring. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Java, Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΡƒΡ‚ нСпосрСдствСнно ΠΊ экзСмпляру, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ.

Π’ Π’Π°ΡˆΠ΅ΠΌ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅,

Π’Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ прокси, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Ρ‡Π΅Ρ€Π΅Π· cglib. ΠŸΡ€ΠΈ запросС Π±ΠΎΠ±Π° этого Ρ‚ΠΈΠΏΠ° ΠΎΡ‚ Spring с [1 154]

Spring Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ MyBeanB ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ прокси ΠΈ поэтому Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удовлСтворяСт API [1 121] (Ρ‚.Π΅. Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ всС Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ фактичСский Π±ΠΎΠ± Ρ‚ΠΈΠΏΠ° MyBeanB для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°.

, Π­Ρ‚ΠΎ возвратится true Π²Ρ‹Π²ΠΎΠ΄ подсказок Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Spring Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ одноэлСмСнтный ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси (Π½Π΅ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ Π±ΠΎΠ±).

Π’Π°ΡˆΠΈΠΌ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ являСтся ΠΏΠΎ сущСству Ρ‚ΠΎ ΠΆΠ΅ ΠΊΠ°ΠΊ Π’Π°ΡˆΠ° сСкунда.

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

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

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Spring прокси ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π² АОП

БСгодня я Π·Π°ΠΏΠΈΡˆΡƒ АОП Spring ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ Π΅Π³ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… частСй:

МодСль агСнтства

Π Π΅ΠΆΠΈΠΌ прокси часто встрСчался Π² исходном ΠΊΠΎΠ΄Π΅ Android, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€,БвязываниС процСсса связиВ процСссС использования AIDL Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ пСрСноса ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ пСрСкрСстной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ пСрСкрСстная ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Parcelable, Π° Π·Π°Ρ‚Π΅ΠΌ выполняСтся транзакционная функция, ΠΈ Π°Π³Π΅Π½Ρ‚, инкапсулированный Π² AIDL, Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ» эти ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Аналогично ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ:

Нам Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ прокси-класс EatAppleProxy, ΠΈ Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ самим ΠΏΠΈΡΠ°Ρ‚ΡŒ процСсс.

Java Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ (Аннотация)

Аннотация прСдоставляСт Π½Π°ΠΌ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ добавлСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ·Π΄Π½Π΅Π΅. Аннотация прСдставлСна ​​в JDK1.5 ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΡ… вСрсиях. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, отслСТивания зависимостСй Π² ΠΊΠΎΠ΄Π΅ ΠΈ Π΄Π°ΠΆΠ΅ выполнСния Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ Π²ΠΎ врСмя компиляции. ΠŸΡ€ΠΎΡ‰Π΅ говоря, это Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π΅Π³ΠΈ ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΊΠΎΠ΄Π°ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΊΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚Π΅Π³ΠΈ.
Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Π»ΡƒΡ‡ΡˆΠ΅ всСго Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ.
ΠœΠ΅Ρ‚Π° Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈΠ ΠΎΠ»ΡŒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. Java 5.0 опрСдСляСт 4 стандартных Ρ‚ΠΈΠΏΠ° ΠΌΠ΅Ρ‚Π°Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для прСдоставлСния инструкций для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠœΠ΅Ρ‚Π°Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Java5.0:

@Target

ΠžΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, значСния (ElementType):

@Retention

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ врСмя хранСния Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

@Documented

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для создания Java Doc.

@Inherited

Как Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ:

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ

** НаиболСС Π²Π°ΠΆΠ½Ρ‹ΠΌ являСтся ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ содСрТимого Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ **: Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² java1.5, Π° Ρ‚Π°ΠΊΠΆΠ΅ добавляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ чтСния Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ AnnotatedElement добавляСтся Π² ΠΏΠ°ΠΊΠ΅Ρ‚ java.lang.reflect. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ JDK выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, посмотритС тСстовый ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ДинамичСский прокси Java

ДинамичСскиС Π°Π³Π΅Π½Ρ‚Ρ‹ Java дСлятся Π½Π° динамичСскиС Π°Π³Π΅Π½Ρ‚Ρ‹ JDK ΠΈ динамичСскиС Π°Π³Π΅Π½Ρ‚Ρ‹ CGLib. Как статичСский язык, Java Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ стандартных динамичСских характСристик, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ JavaScript, php, python ΠΈ Ρ‚. Π”. Но Java постСпСнно добавляСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ динамичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² Ρ‚ΠΎΠΌ числС:ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ отраТСния、ДинамичСская компиляция、ДинамичСскоС ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚-кодом、ДинамичСскоС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅.

JDK динамичСский прокси

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ отраТСния (отраТСния) Π½Π° основС JDK Π’ JDK прСдусмотрСн интСрфСйс InvocationHandler. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠœΠ΅Ρ‚ΠΎΠ΄ Π°Π³Π΅Π½Ρ‚Π° CGLib

ΠœΠΎΡ‰Π½Π°Ρ, Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ, высококачСствСнная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ класс Java ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс Java Π²ΠΎ врСмя выполнСния, НиТний слой с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ нСбольшого ΠΈ быстрогоБрСда ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° ASMΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ класс. Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ CGLib измСняСт Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Java со слоя Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°. ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ MethodInterceptor здСсь ΠΏΠΎΡ…ΠΎΠΆ Π½Π° InvocationHandler Π² динамичСском прокси JDK.

ВСрминология ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² АОП

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

На рисункС Π²Ρ‹ΡˆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° взаимосвязь ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌΠΈ Π²Ρ‹ΡˆΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°ΠΌΠΈ.

Π’ настоящСС врСмя Spring ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² качСствС Ρ‚ΠΎΡ‡Π΅ΠΊ соСдинСния (ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π² Π±ΠΈΠ½Π°Ρ… Spring). Π₯отя ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ², Π½Π΅ затрагивая основной API Spring AOP, Spring Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ². Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Π² качСствС Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ для ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ языки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ AspectJ.

ИспользованиС AOP Π² Spring ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ xml Spring ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ AspectJ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ AOP.

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Spring xml
AspectJ

Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ большС, рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ поисковый Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ Π»ΡƒΡ‡ΡˆΠ΅, ΠΏΠΎΡ€Ρ‚Π°Π»,AspectJ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

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

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

Spring AOP Π°Π½Π°Π»ΠΈΠ· исходного ΠΊΠΎΠ΄Π° созданиС прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

1. Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌΡΡ‚Π°Ρ‚ΡŒΡΠ’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π», ΠΊΠ°ΠΊ Spring Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΡƒΠ΅Ρ‚ подходящиС ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚Π΅Π»ΠΈ для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° совСтник Π²Ρ‹Π±Ρ€Π°Π½, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΏΠ»Π΅Ρ‚Π΅Π½ΠΈΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ, содСрТащихся Π² совСтникС (Advisor), Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· прокси. По ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΎΡ‚Π±ΠΎΡ€ΠΎΠΌ подходящих ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚Π΅Π»Π΅ΠΉ, процСсс создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‰Π΅: исходный ΠΊΠΎΠ΄, Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, состоит всСго ΠΈΠ· 100 строк, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ просто. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π³Π»Π°Π²Π°Ρ… я сначала познакомлю вас с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ знаниями, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽ исходный ΠΊΠΎΠ΄. Π’ΠΎΠ³Π΄Π° Π΄Π°Π²Π°ΠΉΡ‚Π΅ сначала разбСрСмся с Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ знаниями.

2. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ знания

2.1 proxy-target-class

Π’ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Spring AOP Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ proxy-target-class ΠΌΠΎΠΆΠ΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ‚ΠΈΠΏ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², создаваСмых Spring. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ XML, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Как ΠΈ Π²Ρ‹ΡˆΠ΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ proxy-target-class ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π΅Π½ false. Когда Ρ†Π΅Π»Π΅Π²ΠΎΠΉ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, Spring создаст прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° основС динамичСского прокси-сСрвСра JDK. Если интСрфСйс Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, Spring создаст прокси Ρ‡Π΅Ρ€Π΅Π· CGLIB. Когда для Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° proxy-target-class установлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Spring Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· CGLIB, Π΄Π°ΠΆΠ΅ Ссли Ρ†Π΅Π»Π΅Π²ΠΎΠΉ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс.

На этом Ρ†Π΅Π»ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° proxy-target-class подошла ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ.Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… способа создания динамичСского прокси.

2.2 ДинамичСский прокси

2.2.1 ДинамичСский прокси Π½Π° основС JDK

ДинамичСский прокси Π½Π° основС JDK Π² основном создаСт прокси для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‡Π΅Ρ€Π΅Π· класс создания прокси Proxy, прСдоставляСмый JDK.Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° объявлСниС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° создания прокси Π² Proxy. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠšΡ€Π°Ρ‚ΠΊΠΎ расскаТСм ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ спискС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

ДинамичСский прокси-сСрвСр JDK ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ трСбования ΠΊ Ρ†Π΅Π»Π΅Π²ΠΎΠΌΡƒ классу, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ интСрфСйс, Π° динамичСский прокси-сСрвСр JDK ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ интСрфСйс. Π§Ρ‚ΠΎ касаСтся InvocationHandler, это Ρ‚ΠΈΠΏ интСрфСйса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ опрСдСляСт ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π°. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈ ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ прокси.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сначала ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ динамичСского прокси JDK. ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСский прокси JDK ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ класса:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ создатСля Π°Π³Π΅Π½Ρ‚Π°:

Как ΠΈ Π²Ρ‹ΡˆΠ΅, Π»ΠΎΠ³ΠΈΠΊΠ° прокси Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π²Ρ‹Π·ΠΎΠ²Π° Π² основном ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для записи Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ окончания Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ тСстовый ΠΊΠΎΠ΄ для простой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

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

2.2.2 ДинамичСский прокси Π½Π° основС CGLIB

Когда ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ прокси для класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ интСрфСйс, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСский прокси JDK. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρ‚Π°ΠΊΠΎΠΉ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ прокси? ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ CGLIB. Π’ CGLIB Π»ΠΎΠ³ΠΈΠΊΠ° прокси инкапсулирована Π² классС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MethodInterceptor, Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ прокси создаСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° create класса Enhancer. ΠŸΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² CGLIB ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ изобраТСния:Поиск ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Baidu

ЦСлСвая катСгория, Ρ‚Π°Π½ΠΊ Π’ΠΈΠΏ 59:

Π‘ΠΎΠ·Π΄Π°Ρ‚Π΅Π»ΡŒ прокси CGLIB

ΠœΠ΅Ρ‚ΠΎΠ΄ восстановлСния Ρ‚Π°Π½ΠΊΠ°-ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊΠ°:

Π›Π°Π΄Π½ΠΎ, приступим ΠΊ дСмонстрации, тСстовый ΠΊΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠΉ:

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСста ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°ΠΊΠΎΠ½Π΅Ρ† взглянСм Π½Π° 59 послС магичСской Ρ€Π΅Ρ„ΠΎΡ€ΠΌΡ‹, Π‘Π²Π΅Ρ€Ρ…Π·Π²ΡƒΠΊΠΎΠ²ΠΎΠΉ 59 Π’ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ изобраТСния: нСизвСстно

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°Π½ΠΊ Type 59. Как ΠΌΠΎΠ»ΠΎΠ΄ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ±Π»Π°Π³ΠΎΠ΄Π°Ρ€ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ… Π½Π°ΡƒΡ‡Π½Ρ‹Ρ… ΠΈ тСхничСских спСциалистов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ внСсли свой Π²ΠΊΠ»Π°Π΄ Π² Π΄Π΅Π»ΠΎ Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±ΠΎΡ€ΠΎΠ½Ρ‹. ΠœΡ‹ опасаСмся, Ρ‡Ρ‚ΠΎ Π±Π΅Π· ΠΈΡ… Π²ΠΊΠ»Π°Π΄Π° Π½Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ‚Π°ΠΊΠΎΠΉ бСзопасной срСды, ΠΊΠ°ΠΊ сСгодня (хотя ΠΈ Π½Π΅ идСальной).

На этом этапС вводятся Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ я Π½Π°Ρ‡Π½Ρƒ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ, Π° ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌ Π΅Π³ΠΎ вмСстС.

3. Анализ исходного ΠΊΠΎΠ΄Π°

ΠŸΠ΅Ρ€Π΅Π΄ созданиСм прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ AopProxy, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ getProxy этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для создания фактичСского прокси-класса. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ интСрфСйса AopProxy, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:

Π’ Spring Π΅ΡΡ‚ΡŒ Π΄Π²Π° класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠ΅ AopProxy, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ:

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring

Π’ процСссС создания прокси для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Spring Ρ€Π΅ΡˆΠ°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ класс Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ AopProxy ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Π»ΠΈ bean-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ интСрфСйс ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° процСсс создания прокси ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Как ΠΈ Π²Ρ‹ΡˆΠ΅, DefaultAopProxyFactory опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ AopProxy Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° основС Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… условий. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ AopProxy сгСнСрирован, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом являСтся созданиС прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° для Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°. Взяв JdkDynamicAopProxy Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° getProxy этого класса. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Как ΠΈ Π²Ρ‹ΡˆΠ΅, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° послСднюю строку Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ JdkDynamicAopProxy Π½Π°ΠΊΠΎΠ½Π΅Ρ† Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Proxy.newProxyInstance для создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. На этом этапС Π±Ρ‹Π» ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ вСсь процСсс создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ это. Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ остановимся Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ исходного ΠΊΠΎΠ΄Π° создания Π°Π³Π΅Π½Ρ‚Π°.

4. РСзюмС

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ анализируСтся процСсс создания прокси-ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Spring AOP ΠΈ вводятся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΏΠ΅Ρ€Π΅Π΄ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ исходного ΠΊΠΎΠ΄Π°. Π’ Ρ†Π΅Π»ΠΎΠΌ тСхничСскиС ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΡ‚Ρ‹Π΅ Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅, Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ слоТныС, я Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ всС ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠ½ΡΡ‚ΡŒ. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ возмоТностями, Ссли Π² тСкстС Π΅ΡΡ‚ΡŒ ошибки, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π½Π° Π½ΠΈΡ…. Π§Ρ‚ΠΎ ΠΆ, Π½Π° этом ΡΡ‚Π°Ρ‚ΡŒΡ заканчиваСтся, спасибо Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

Π‘ΠΏΡ€Π°Π²ΠΊΠ°

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: список статСй ΠΎΠ± Π°Π½Π°Π»ΠΈΠ·Π΅ исходного ΠΊΠΎΠ΄Π° Spring

Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ Creative Commons License 4.0, ΠΈ источник Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½ Π² ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠΌ мСстС для ΠΏΠ΅Ρ€Π΅ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ.
OF: coolblog.xyz
Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π° Π² ΠΌΠΎΠ΅ΠΌ Π»ΠΈΡ‡Π½ΠΎΠΌ Π±Π»ΠΎΠ³Π΅:http://www.coolblog.xyz

Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring. Π€ΠΎΡ‚ΠΎ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ прокси spring
Π­Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Creative Commons Attribution-Non-Commercial Use-No Derivation 4.0 International License AgreementΠ‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

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

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

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