JavaRush /Kurslar /All lectures for UZ purposes /Maslahatli obyektlarni boshqarish

Maslahatli obyektlarni boshqarish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Qanday qilib AOP proxy yaratgan bo'lsangiz ham, ularga org.springframework.aop.framework.Advised interfeysi orqali boshqarish mumkin. Har qanday AOP proxy ushbu interfeysga o'tkazilishi mumkin, qaysi boshqa interfeyslarni amalga oshirishidan qat'i nazar. Ushbu interfeys quyidagi metodlarni o'z ichiga oladi:

Java
Advisor[] getAdvisors();
void addAdvice(Advice advice) throws AopConfigException;
void addAdvice(int pos, Advice advice) throws AopConfigException;
void addAdvisor(Advisor advisor) throws AopConfigException;
void addAdvisor(int pos, Advisor advisor) throws AopConfigException;
int indexOf(Advisor advisor);
boolean removeAdvisor(Advisor advisor) throws AopConfigException;
void removeAdvisor(int index) throws AopConfigException;
boolean replaceAdvisor(Advisor a, Advisor b) throws AopConfigException;
boolean isFrozen();
Kotlin
fun getAdvisors(): Array<Advisor>
@Throws(AopConfigException::class)
fun addAdvice(advice: Advice)
@Throws(AopConfigException::class)
fun addAdvice(pos: Int, advice: Advice)
@Throws(AopConfigException::class)
fun addAdvisor(advisor: Advisor)
@Throws(AopConfigException::class)
fun addAdvisor(pos: Int, advisor: Advisor)
fun indexOf(advisor: Advisor): Int
@Throws(AopConfigException::class)
fun removeAdvisor(advisor: Advisor): Boolean
@Throws(AopConfigException::class)
fun removeAdvisor(index: Int)
@Throws(AopConfigException::class)
fun replaceAdvisor(a: Advisor, b: Advisor): Boolean
fun isFrozen(): Boolean

getAdvisors() metodi har bir maslahatchiga qo'shilgan maslahatchi, catch qilib oluvchi yoki boshqa turdagi maslahatchi uchun Advisor qaytaradi. Agar siz Advisor qo'shgan bo'lsangiz, qaytarilgan maslahatchi ushbu indeksda siz qo'shgan ob'ekt bo'ladi. Agar siz catch qilib oluvchi yoki boshqa turdagi maslahatchi qo'shgan bo'lsangiz, Spring uni har doim true qaytaradigan maslahatchi bilan o'raladi. Masalan, agar siz MethodInterceptor qo'shsangiz, ushbu indeks uchun qaytarilgan maslahatchi sizning MethodInterceptor va barcha sinflar va metodlarga mos keladigan kesim bo'lgan DefaultPointcutAdvisor bo'ladi.

addAdvisor() metodlari har qanday Advisor qo'shish uchun ishlatilishi mumkin. Odatda, kesim va maslahatchini o'z ichiga olgan maslahatchi hamma uchun mos DefaultPointcutAdvisor bo'ladi, uni har qanday maslahatchi yoki kesim bilan ishlatish mumkin (lekin kiritishlar uchun emas).

Default bo'yicha, massiv yaratilgandan keyin ham maslahatchilar yoki catch qilib oluvchilarni qo'shish yoki o'chirish mumkin. Yagona cheklov kiritish maslahatchilarini qo'shish yoki o'chirishning mumkin emasligi, chunki mavjud proxylar interfeys o'zgarishlarini ko'rsatmaydi. (Ushbu muammoga qarshi kurashish uchun, fabrikadan yangi proxy olish mumkin).

Keyingi misolda AOP proxyni Advised interfeysiga o'tkazish va uning maslahati bilan ishlash ko'rsatilgan:

Java
Advised advised = (Advised) myObject;
Advisor[] advisors = advised.getAdvisors();
int oldAdvisorCount = advisors.length;
System.out.println(oldAdvisorCount + " maslahatchilar");
// Maslahatni catch qilib oluvchi sifatida, kesimsiz qo'shamiz
// Barcha proxylangan metodlar uchun mos keladi
// "Interception", "before", "after return" yoki "exception generation" maslahatchilari uchun ishlatilishi mumkin
advised.addAdvice(new DebugInterceptor());
// Tanlangan maslahatchini kesim bilan qo'shamiz
advised.addAdvisor(new DefaultPointcutAdvisor(mySpecialPointcut, myAdvice));
assertEquals("Ikki maslahatchi qo'shildi", oldAdvisorCount + 2, advised.getAdvisors().length);
Kotlin
val advised = myObject as Advised
val advisors = advised.advisors
val oldAdvisorCount = advisors.size
println("$oldAdvisorCount maslahatchilar")
// Maslahatni catch qilib oluvchi sifatida, kesimsiz qo'shamiz
// Barcha proxylangan metodlar uchun mos keladi
// "Interception", "before", "after return" yoki "exception generation" maslahatchilari uchun ishlatilishi mumkin
advised.addAdvice(DebugInterceptor())
// Tanlangan maslahatchini kesim bilan qo'shamiz
advised.addAdvisor(DefaultPointcutAdvisor(mySpecialPointcut, myAdvice))
assertEquals("Ikki maslahatchi qo'shildi", oldAdvisorCount + 2, advised.advisors.size)
Ishonch yo'qki, arbets joyida biznes ob'ekti uchun maslahatchilarni o'zgartirish (tasodifiy piching) maqsadga muvofiqdir, lekin, shubhasiz, bunday amaliyotning asosli holatlari mavjud. Biroq bu rivojlanishda (masalan, testlarda) juda foydali bo'lishi mumkin. Ba'zida, metod chaqiruvi ichiga kirib olish uchun interceptoryo boshqa maslahatchi sifatida test kodini qo'shish juda foydali bo'lishi mumkin. (Masalan, maslahatchi ushbu metod uchun yaratilgan tranzaksiya ichiga kiritilishi mumkin, ehtimol SQL boshlash uchun, bazaning to'g'ri yangilanganligini tekshirishdan oldin tranzaksiyani bekor qilish uchun belgilash).

Proxy qanday yaratilganiga qarab, odatda frozen flagini o'rnatish mumkin. Bunday holda, Advised isFrozen() metodi true qaytaradi va har qanday maslahatchini qo'shish yoki olib tashlashni o'zgartirishga urinishlar AopConfigException bilan yakunlanadi. Maslahatli ob'ektning holatini muzlatish imkoniyati ba'zi holatlarda foydali bo'lishi mumkin (masalan, chaqiruv kodining xavfsizlik interceptorini olib tashlashdan himoya qilish uchun).

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION