Як би ти не створював проксі АОП, ними можна маніпулювати ЧЕРЕЗ інтерфейс org.springframework.aop.framework.Advised. Будь-який проксі АОП можна привесту до цього інтерфейсу незалежно від того, які інші інтерфейси він реалізує. Цей інтерфейс містить такі методи:

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() повертає Advisor для кожного радника, перехоплювача або іншого типу поради, який додано до фабрики. Якщо додано Advisor, радником, що повертається за цим індексом, буде об'єкт, який додано. Якщо додано перехоплювач або інший тип поради, Spring оберне його до радника зі зрізом, який завжди повертає true. Таким чином, якщо додано MethodInterceptor, радник, який повертається для цього індексу, буде DefaultPointcutAdvisor, який повертає твій MethodInterceptor і зріз, що збігається з усіма класами та методами.

Методи addAdvisor() можна використовувати для додавання будь-якого Advisor. Зазвичай радником, що містить зріз та пораду, є загальний DefaultPointcutAdvisor, який можна використовувати з будь-якою порадою або зрізом (але не для введень).

За замовчуванням можна додавати або видаляти радники або перехоплювачі навіть після створення проксі. Єдиним обмеженням є неможливість додавання або видалення радника вступу, оскільки існуючі проксі з фабрики не показують змін інтерфейсу. (Щоб уникнути цієї проблеми, можна отримати новий проксі з фабрики).

У наступному прикладі показано приведення проксі АОП до інтерфейсу Advised, а також вивчення та маніпулювання його порадою:

Java
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);
Kotlin
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)
Немає впевненості, що можна радити (випадковий каламбур) змінювати поради для бізнес-об'єкта в експлуатаційному середовищі, хоча, без сумніву, є обґрунтовані випадки такої практики. Однак це може бути дуже корисним у розробці (наприклад, у тестах). Іноді ми знаходимо дуже корисну можливість додати тестовий код у вигляді перехоплювача або іншої поради, потрапляючи всередину виклику методу, який хочемо протестувати. (Наприклад, рада може потрапити всередину транзакції, створеної для цього методу, можливо, для запуску SQL, щоб перевірити, чи база даних була правильно оновлена, перш ніж помітити транзакцію для відкату).