Аспект и ловля приватными или внутренними методами - PullRequest
6 голосов
/ 09 декабря 2010

Я настроил AspectJ с помощью Spring, и он отлично работает, когда «ловит» публичные методы, вызываемые из класса. Теперь я хочу сделать что-то вроде этого:

public class SomeLogic(){

   public boolean someMethod(boolean test){

      if(test){
        return innerA();
      } else {
        return innerB();
      }
   }


   private boolean innerA() {// some logic}
   private boolean innerA() {// some other logic}

}

SomeLogic - это SpringBean. Методы innerA () и innerB () могут быть объявлены как private или public - метод someMethod () вызывается из действия Struts. Можно ли с помощью AspectJ отлавливать методы innerA () или innerB (), вызываемые из someMethod ()?

Моя конфигурация (на основе XML):

    <aop:aspect id="innerAAspect" ref="INNER_A">
        <aop:pointcut id="innerAService" expression="execution(* some.package.SomeLogic.innerA(..))"/>
    </aop:aspect>

    <aop:aspect id="innerAAround" ref="INNER_A">
        <aop:around pointcut-ref="innerAService" method="proceed"/>
    </aop:aspect>


    <aop:aspect id="innerBAspect" ref="INNER_B">
        <aop:pointcut id="innerBService" expression="execution(* some.package.SomeLogic.innerB(..))"/>
    </aop:aspect>

    <aop:aspect id="innerBAround" ref="INNER_B">
        <aop:around pointcut-ref="innerBService" method="proceed"/>
    </aop:aspect>

1 Ответ

5 голосов
/ 10 декабря 2010

Да, с помощью AspectJ легко поймать приватные методы.

Пример, который печатает предложение перед всеми приватными методами:

 @Pointcut("execution(private * *(..))")
 public void anyPrivateMethod() {}

 @Before("anyPrivateMethod()")
 public void beforePrivateMethod(JoinPoint jp) {
     System.out.println("Before a private method...");
 }

Если вы знакомы с Eclipse, я рекомендуюРазработайте AspectJ с STS или установите только плагин AJDT .

Подробнее о возможностях Spring AOP можно найти в справочной документации Spring здесь .

...