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:
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();
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:
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);
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)
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).
GO TO FULL VERSION