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:
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
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:
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);
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)
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).