Весенняя регистрация по имени пакета - PullRequest
1 голос
/ 24 августа 2010

Мне нужно зарегистрировать много классов в некоторых пакетах в проекте, в котором я не могу изменить его исходный код. Поэтому мне нужно решение, в котором я могу указать имя пакета, и с помощью Spring AOP добавить протоколирование в классы этого пакета без изменения их, но я не знаю, как я могу это сделать. Как я могу это сделать?

1 Ответ

1 голос
/ 24 августа 2010

В Spring AOP вы можете регистрировать эти классы только в том случае, если они используются в качестве Spring Beans, и даже тогда вы можете регистрировать только выполнение открытых методов.

Вот аспект в уведомлении @AspectJ (это стилькоторый совместим как с «настоящим AspectJ», так и с Spring AOP, прочитайте о разнице в ссылочном коде пружины ), которую вы можете использовать при переплетении байтов кода Spring AOP и AspectJ:

@Aspect
public class LoggingAspect{

    @Pointcut("execution(* com.mycompany.myproject.*.*(..))")
    public void methodToLog(){
    };

    @Around("methodToLog()")
    public Object logMethod(final ProceedingJoinPoint joinPoint) throws Throwable{
        final StaticPart staticPart = joinPoint.getStaticPart();
        final String sig =
            "" + staticPart.getSignature() + " with args: "
                + Arrays.deepToString(joinPoint.getArgs());
        System.out.println("Entering method " + sig);
        final Object result = joinPoint.proceed();
        System.out.println("Leaving method " + sig);
        return result;
    }

}

Вот глупый класс с некоторыми методами:

package com.mycompany.myproject;
public class Dummy1{

    public static void main(final String[] args){
        final Dummy1 dummy = new Dummy1();
        dummy.doSomeStuff();
        dummy.doSomeStuffWithSomeArgs("Hello", 123);
    }

    private void doSomeStuff(){}

    public void doSomeStuffWithSomeArgs(final String firstArg,
        final int secondArg){}

}

Когда вы запускаете этот класс в Eclipse / AJDT как приложение Java / AspectJ, вы получаете следующий вывод:

Entering method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]
Entering method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Entering method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]

Toтестирование этого в Spring AOP потребует больше работы (подход основного метода не будет работать, вам придется создать ApplicationContext и зарегистрировать бин типа Dummy1, для которого вы будете вызывать методы), поэтому я оставлю это длявы, но я уверен, что вызов частного метода не будет зарегистрирован.

Если вы загрузите SpringSource Tool Suite , вы получите хорошие инструменты дляr аспект визуализации и тестирования.Вам также следует прочитать книгу AspectJ , даже если вы хотите использовать только Spring AOP.Это отличная книга.


Кстати: вам наверняка захочется использовать настоящий регистратор, а не system.out.Вы можете либо определить один для каждого аспекта, либо (только с реальным аспектом j) вы можете представить его как статический член в целевом классе для получения регистрации каждого класса.На мой взгляд, убийственная особенность AspectJ.

...