Spring AOP: ведение журнала и вложенные методы

Я написал простое приложение Spring2.5 для демонстрации / тестирования АОП; в частности, я хочу регистрировать вход и выход каждого метода каждого класс в конкретном пакете. Это то, что у меня есть ...

(примечание: я использую контроллеры аннотаций; я опускаю детали, не связанные напрямую с aop, потому что моя базовая настройка работает нормально - я включаю только aop -связанные детали - дайте мне знать, если вам нужно больше)


applicationContext.xml:

(...)
<bean id="loggerInterceptor" class="aspect.LoggerInterceptor" />
(...)

dispatcher-servlet.xml:

(...)
<aop:aspectj-autoproxy proxy-target-class="true" />
(...)

HomeController.java:

public class HomeController() {

    public HomeController() { }

    public ModelAndView get() {
        System.out.println("In HomeController#get()...");

        this.somePrivateMethod();
        this.somePublicMethod();

        return new ModelAndView( "home" );
    }

    private void somePrivateMethod() {
        System.out.println("In HomeController#somePrivateMethod()...");
    }

    public void somePublicMethod() {
        System.out.println("In HomeController#somePublicMethod()...");
    }
}

LoggerInterceptor.java:

public class LoggerInterceptor {

    @Pointcut("execution(* controller.*.*(..))")
    private void anyOperationInControllerPackage() {
        /* nothing to do here;
         * this just defines that we want to catch all methods
         * in the controller-package
         */
    }

    @Around("anyOperationInControllerPackage()")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("Entering " + joinPoint.getSignature().getDeclaringTypeName() + "#" + joinPoint.getSignature().getName() + "() using arguments: " + Arrays.toString( joinPoint.getArgs() ) );

        try {

            Object result = joinPoint.proceed();

            System.out.println("Leaving " + joinPoint.getSignature().getDeclaringTypeName() + "#" + joinPoint.getSignature().getName() + "()." );

            return result;

        } catch (Throwable ex) {

            ex.printStackTrace();
            throw ex;

        }

    }

}

Вот что я получаю, когда вызывается HomeController # get ():

Entering controller.HomeController#get() using arguments: []
In HomeController#get()...
In HomeController#somePrivateMethod()...
In HomeController#somePublicMethod()...
Leaving controller.HomeController#get().

Как видите, единственный перехватываемый метод - это HomeController # get (). Когда #get () вызывает #somePrivateMethod () или #somePublicMethod (), перехватчик их не улавливает. Я ожидал, по крайней мере, что #somePublicMethod () также будет пойман (и поскольку я использую cglib, я также ожидал бы, что #somePrivateMethod () будет пойман).

Итак, я предполагаю, что мой вопрос: что мне нужно изменить / добавить, чтобы (по крайней мере) все общедоступные методы в пакете контроллера перехватывались, даже если их вызвал другой метод в этом пакете и сам был пойман первым ???

I надеюсь, что это имеет смысл. : D


РЕДАКТИРОВАТЬ (25APR2011 @ 13:13 PM)

applicationContext.xml:

(...)
<context:load-time-weaver />  <!-- added -->
<bean id="loggerInterceptor"... />
(...)

aop.xml:

<!DOCTYPE aspectj PUBLIC
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <!-- only weave classes in this package -->
        <include within="controller.*" />
    </weaver>
    <aspects>
        <!-- use only this aspect for weaving -->
        <aspect name="aspect.LoggerInterceptor" />
    </aspects>
</aspectj>

В «Свойствах проекта» Netbean на вкладке «Выполнить» я добавил эту строку в «ВМ. Параметры " :

-javaagent:C:\Users\bgresham\Documents\libraries\spring-framework-2.5\dist\weaving\spring-agent.jar

Как и прежде, я не получаю никаких ошибок - я просто не получаю" вложенные "журналы, которые я ищу.

???

6
задан Bane 25 April 2011 в 19:25
поделиться