2016-07-25 5 views
2

Я пытаюсь сделать осуществлять регистрацию в AOP в Google - Guice. Для этого я использовал MethodInterceptor, но он не работает. Я использовал то же самое весной, определяя точки. Там все прекрасно работает.AOP на основе регистрации в Guice

Spring Код для АОП на основе регистрации -

@Aspect 
public class LoggingAspect { 

private static Logger logger = LoggerFactory.getLogger(LoggingAspect.class); 

    @Around("requiredLog()") 
    public Object bentoBoxAround(ProceedingJoinPoint proceedingJoinPoint) { 

     Object returnValue = null; 
     try { 

      logger.info("Entered into the method -> " + proceedingJoinPoint.getSignature().toShortString() 
        + " and input arguments are -> " + Arrays.asList(proceedingJoinPoint.getArgs())); 
      returnValue = proceedingJoinPoint.proceed(); 
      logger.info("Method Execution over !! " + proceedingJoinPoint.getSignature().toShortString()); 
     } catch (Throwable e) { 
      logger.error("Method has an exception " + e.getMessage()); 
     } 
     return returnValue; 
    } 

    @Pointcut("within(org.cal.bento..*)") 
    public void allRequiredPakageLog() { 
    } 

} 

Из выше кода мы можем регистрировать все расстрелы класса и метод внутри org.cal.bento.* пакета.

Guice код АОП на основе протоколирования -

public class GuiceLoggingInterceptor implements MethodInterceptor { 

private static Logger logger = LoggerFactory 
.getLogger(GuiceLoggingInterceptor.class); 

    @Override 
    public Object invoke(MethodInvocation invocation) throws Throwable { 
    Object returnValue = null; 
    try { 
     logger.info("GUICE - Entered into the method -> " + invocation.getMethod().getName() 
        + " and input arguments are -> " + Arrays.asList(invocation.getArguments())); 
     returnValue = invocation.proceed(); 
     logger.info("Method Execution over !! " + invocation.getMethod().getName()); 
    } catch (Throwable e) { 
     logger.error("GUICE - Method has an exception " + e.getMessage()); 
    } 
    return returnValue; 
    } 
} 

Binding Класс -

public class GuiceAopModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bindInterceptor(Matchers.any(), Matchers.any(), new GuiceLoggingInterceptor()); 
    } 
} 

Можем ли мы сделать то же в Guice для входа (путем определения класса на основе только один аспект для всей система регистрации). Я не хочу изменять каждый класс.

Refered Учебник - https://schakrap.wordpress.com/2009/07/30/method-entry-exit-logging-in-guice-with-aop/

Любая помощь будет высоко оценен.

+0

«Я использовал MethodInterceptor для этого, но он не работает». Каков ожидаемый результат? – CKing

+0

Я хочу зарегистрировать все выполнение метода внутри пакета. Этот код, который я использовал, отлично соблюдает, но не блокирует какой-либо журнал внутри файла журнала. –

+0

Как создаются ваши объекты? Перехват метода с помощью guice работает только тогда, когда Guice создает все экземпляры, которые вы хотите перехватить. – pandaadb

ответ

2

Ваша проблема заключается в том, что вы не пользуетесь приложением для создания. Из Guice документы:

Этот подход накладывает ограничения на то, что классы и методы могут быть перехвачены :

[...]

Экземпляры должны быть созданы с помощью Guice на @ Inject аннотированный или Конструктор без аргументов Невозможно использовать перехват метода экземпляров, которые не созданы Guice.

Таким образом, это означает, что, поскольку ваши экземпляры создаются весной и, вероятно, добавляются к узору, у guice нет шансов проксировать эти классы для перехвата.

Источник:

https://github.com/google/guice/wiki/AOP

Edit:

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

  1. Spring создает экземпляры ,

  2. Поместите их в Guice

  3. Создание объекта делегата, который создается с помощью Guice и ввести боб (1) в обертку.

  4. Используйте обертку вместо объекта в 1, а затем методы будут перехвачены.

+0

Да, я тоже это сделал, и это работает как шарм. В моем случае весна загружает все зависимости, поэтому я внес некоторые изменения конфигурации. –

+0

Звучит неплохо :), вы можете отметить ответ правильно, если он ответил на ваш запрос – pandaadb