Independientemente de cómo cree proxies AOP, se pueden manipular A TRAVÉS de la interfaz org.springframework.aop.framework.Advised. Cualquier proxy AOP se puede transmitir a esta interfaz, independientemente de qué otras interfaces implemente. Esta interfaz incluye los siguientes métodos:

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

El método getAdvisors() devuelve un Advisor para cada asesor, interceptor u otro tipo de consejo que se haya agregado a la fábrica. Si agregó Advisor, entonces el asesor devuelto para ese índice será el objeto que agregó. Si agregó un interceptor u otro tipo de consejo, Spring lo envolverá en un asesor dividido que siempre devuelve true. Entonces, si agregó un MethodInterceptor, el asesor devuelto para ese índice sería un DefaultPointcutAdvisor, que devuelve su MethodInterceptor y un segmento que coincide con todas las clases y métodos.

Los métodos addAdvisor() se pueden utilizar para agregar cualquier Advisor. Normalmente, el asesor que contiene el segmento y la sugerencia es el DefaultPointcutAdvisor genérico, que se puede utilizar con cualquier sugerencia o segmento (pero no para presentaciones).

De forma predeterminada, puede agregar o eliminar asesores o interceptores incluso después de crear un proxy. La única limitación es que no es posible agregar o eliminar un asesor de introducción, ya que los proxies existentes de fábrica no muestran cambios en la interfaz. (Para evitar este problema, puede obtener un nuevo proxy de fábrica.

El siguiente ejemplo muestra cómo transmitir un proxy AOP a la interfaz Advised y examinar y manipular sus consejos:

Java
Advised advised = (Advised) myObject;
Advisor[] advisors = advised.getAdvisors();
int oldAdvisorCount = advisors.length;
System.out.println(oldAdvisorCount + " advisors");
// Add the tip as an interceptor, without cutting
// Will match all proxied methods
// Can be used for "catch", "before", "after return" or "throw exception" advice
advised.addAdvice(new DebugInterceptor());
// Add the selected tip using a slice
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")
// Add the tip as an interceptor, without cutting
// Will match all proxied methods
// Can be used for "catch", "before", "after return" or "throw exception" advice
advised.addAdvice(DebugInterceptor())
// Add the selected tip using a slice
advised.addAdvisor(DefaultPointcutAdvisor(mySpecialPointcut, myAdvice))
assertEquals("Added two advisors", oldAdvisorCount + 2, advised.advisors.size)
No es seguro que sea aconsejable (nunca mejor dicho) cambiar el asesoramiento de una entidad comercial en producción, aunque sin duda existen casos legítimos de tal práctica. Sin embargo, puede resultar muy útil durante el desarrollo (por ejemplo, en pruebas). A veces nos resulta muy útil poder agregar código de prueba en forma de interceptor u otro consejo, ingresando a la llamada al método que queremos probar. (Por ejemplo, la sugerencia podría ingresar a una transacción creada para este método, tal vez ejecutando SQL para verificar que la base de datos se actualizó correctamente antes de marcar la transacción para revertirla).

Dependiendo de cómo se creó el proxy, normalmente puedes configurar el indicador frozen. En este caso, el método Advised isFrozen() devuelve true y cualquier intento de cambiar el consejo agregando o eliminando da como resultado una AopConfigException. La capacidad de congelar el estado de un objeto recomendado es útil en algunos casos (por ejemplo, para evitar que la persona que llama elimine un gancho de seguridad).