Як би ти не створював проксі АОП, ними можна маніпулювати ЧЕРЕЗ інтерфейс org.springframework.aop.framework.Advised. Будь-який проксі АОП можна привесту до цього інтерфейсу незалежно від того, які інші інтерфейси він реалізує. Цей інтерфейс містить такі методи:
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() повертає Advisor для кожного радника, перехоплювача або іншого типу поради, який додано до фабрики. Якщо додано Advisor, радником, що повертається за цим індексом, буде об'єкт, який додано. Якщо додано перехоплювач або інший тип поради, Spring оберне його до радника зі зрізом, який завжди повертає true. Таким чином, якщо додано MethodInterceptor, радник, який повертається для цього індексу, буде DefaultPointcutAdvisor, який повертає твій MethodInterceptor і зріз, що збігається з усіма класами та методами.
Методи addAdvisor() можна використовувати для додавання будь-якого Advisor. Зазвичай радником, що містить зріз та пораду, є загальний DefaultPointcutAdvisor, який можна використовувати з будь-якою порадою або зрізом (але не для введень).
За замовчуванням можна додавати або видаляти радники або перехоплювачі навіть після створення проксі. Єдиним обмеженням є неможливість додавання або видалення радника вступу, оскільки існуючі проксі з фабрики не показують змін інтерфейсу. (Щоб уникнути цієї проблеми, можна отримати новий проксі з фабрики).
У наступному прикладі показано приведення проксі АОП до інтерфейсу Advised, а також вивчення та маніпулювання його порадою:
Advised advised = (Advised) myObject;
Advisor[] advisors = advised.getAdvisors();
int oldAdvisorCount = advisors.length;
System.out.println(oldAdvisorCount + "advisors");
// Додаємо пораду як перехоплювач, без зрізу
// Відповідатиме всім проксованим методам
// Може використовуватися для порад "перехоплення", "перед", "після повернення" або "генерація винятку"
advised.addAdvice(new DebugInterceptor());
// Додаємо обрану пораду за допомогою зрізу
advised.addAdvisor(new DefaultPointcutAdvisor(mySpecialPointcut, myAdvice));
assertEquals("Added two advisors", oldAdvisorCount + 2, advised.getAdvisors().length);
val advised = myObject as Advised
val advisors = advised.advisors
Val oldAdvisorCount = advisors.size
println("$oldAdvisorCount advisors")
// Додаємо пораду як перехоплювач, без зрізу
// Відповідатиме всім проксованим методам
// Може використовуватися для порад "перехоплення", "перед", "після повернення" або "генерація винятку"
advised.addAdvice(DebugInterceptor())
// Додаємо обрану пораду за допомогою зрізу
advised.addAdvisor(DefaultPointcutAdvisor(mySpecialPointcut, myAdvice))
assertEquals("Added two advisors", oldAdvisorCount + 2, advised.advisors.size)
Залежно від того, яким чином проксі було створено, можна встановити прапор frozen. У цьому випадку метод Advised isFrozen() повертає true, а будь-які спроби змінити пораду через додавання або видалення призводять до AopConfigException. Можливість заморозити стан обладнаного порадою об'єкта корисна в деяких випадках (наприклад, для запобігання видаленню викликаючим кодом перехоплювача безпеки).
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ