Як би ти не створював проксі АОП, ними можна маніпулювати ЧЕРЕЗ інтерфейс 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
. Можливість заморозити стан обладнаного порадою об'єкта корисна в деяких випадках (наприклад, для запобігання видаленню викликаючим кодом перехоплювача безпеки).