Выражение pointcut АОП для любого общедоступного метода службы

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

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

person Konrad Garus    schedule 28.07.2011    source источник


Ответы (1)


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

Я бы сделал, создав два отдельных точечных разреза, один для всех общедоступных методов и один для всех классов, аннотированных с помощью @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() {}
person nicholas.hauschild    schedule 28.07.2011
comment
Эти точечные разрезы проверены? Насколько я знаю, @annotation не определяет точку соединения, а собирает ее контекст. Может быть, вам следует использовать @within вместо этого? - person Constantiner; 28.07.2011
comment
Я упомянул в ответе, что не тестировал эти точки. Но я согласен, спрашивающий, вероятно, предпочел бы использовать @within для достижения желаемых результатов. - person nicholas.hauschild; 28.07.2011
comment
Не лучше ли тогда изменить свой ответ? Я думаю, что это может не работать в том виде, в котором оно есть сейчас. Я сделал то, что задает вопрос, используя within, и это работает, но теперь я понимаю, что должен использовать @within. - person Niall Thomson; 28.07.2011
comment
Я думаю, что within используется, когда вы ищете «внутри» данного сопоставителя, а @within используется, когда вы ищете «внутри» чего-то, аннотированного совпадающими аннотациями. Кроме того, я, возможно, не упомянул об этом в своем предыдущем комментарии, но я действительно обновил код. - person nicholas.hauschild; 28.07.2011