Выражение AOP pointcut для любого открытого метода службы - PullRequest
5 голосов
/ 28 июля 2011

Какое простейшее выражение pointcut, которое будет перехватывать все открытые методы всех bean-компонентов, помеченных @Service? Например, я ожидаю, что это повлияет на оба открытых метода этого компонента:

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

1 Ответ

3 голосов
/ 28 июля 2011

Эта документация должна быть чрезвычайно полезной.

Я бы сделал, создав два отдельных точечных разреза, один для всех открытых методов и один для всех классов, аннотированных @Service, а затемсоздайте третий, который объединяет выражения pointcut двух других.

Взгляните на ( 7.2.3.1 Поддерживаемые указатели Pointcut ), для которых используются указатели.Я думаю, что вы после указателя «выполнение» для поиска открытых методов и указатель «аннотации» для поиска вашей аннотации.

Затем взгляните на ( 7.2.3.2 Объединение выражений pointcut ) для их объединения.

Ниже приведен некоторый код (который я не проверял ).В основном это взято из документации.

@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() {}
...