2011-07-28 11 views
5

¿Cuál es la expresión de punto de corte más simple que interceptaría todos los métodos públicos de todos los beans anotados con @Service? Por ejemplo, espero que afectan tanto a los métodos públicos de este bean:expresión de punto de corte AOP para cualquier método público de un servicio

@Service 
public MyServiceImpl implements MyService { 
    public String doThis() {...} 
    public int doThat() {...} 
    protected int doThatHelper() {...} // not wrapped 
} 

Respuesta

4

Este documentation debe ser extremadamente útil.

Lo haría creando dos cortes de puntos individuales, uno para todos los métodos públicos, y uno para todas las clases anotadas con @Service, y luego crearé un tercero que combine las expresiones de puntos de corte de los otros dos.

Tome un vistazo a (7.2.3.1 Apoyado pointcut designadores) para los que los designadores de usar. Creo que buscas el designador de "ejecución" para encontrar métodos públicos y el designador de "anotación" para encontrar tu anotación.

A continuación, echar un vistazo a (7.2.3.2 La combinación de expresiones pointcut) para combinarlas.

He proporcionado algunos códigos a continuación (que tengo no probado). Se toma principalmente de la documentación.

@Pointcut("execution(public * *(..))") //this should work for the public pointcut 
private void anyPublicOperation() {} 

//@Pointcut("@annotation(Service)") this might still work, but try 'within' instead 
@Pointcut("@within(Service)") //this should work for the annotation service pointcut 
private void inTrading() {} 

@Pointcut("anyPublicOperation() && inTrading()") 
private void tradingOperation() {} 
+1

se prueban estos puntos de corte? Por lo que sé, '@ annotation' no define punto de unión, sino que recoge su contexto. ¿Tal vez deberías usar '@ within' en su lugar? – Constantiner

+0

Mencioné en la respuesta que no he probado estos puntos de corte. Pero estoy de acuerdo, el autor de la pregunta probablemente prefiera usar @within para lograr los resultados deseados. –

+0

¿No sería mejor enmendar su respuesta? Creo que podría no funcionar como está actualmente. He hecho lo que hace la pregunta usando 'within' y funciona, pero ahora me doy cuenta de que debería estar usando' @ within'. –

Cuestiones relacionadas