2014-11-20 4 views
1

построил простую программу для весенних игр с некоторыми аспектами проверки архитектуры и так далее.AOP с Springboot, java.io.PrintStream

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

System.out.println() использует PrintStream так, что Я пробовал:

@Aspect 
@Component 
public class CleanCodeAspect { 

    @Before("call(void java.io.PrintStream.println(String))") 
    public void beforePrintlnCall() { 
     System.out.println("About to make call to print Hello World"); 
    } 

} 

Но без успеха. Журнал говорит

The pointcutexpression call(void java.io.PrintStream.println(String)) contains unsupported pointcut primitive 'call' 

Аналогичный аспект работает, но с выполнением вместо вызова:

@Aspect 
@Component 
public class BooleanServiceMonitor { 

    @Before("execution(* de.fhb..*Service.*(java.lang.Boolean))") 
     public void logServiceAccess() { 
      System.out.println("You used a method with only one boolean parameter. " 
        + "Refactor it into 2 methods with True, False at the end."); 
     } 

    } 
+1

Весна использует прокси-серверы для применения АОП, весна может использовать только боты с пружинным основанием. Класс, реализующий «PrintStream», обычно не является компонентом, настроенным на пружину. Рядом с тем, что Spring AOP поддерживает только подмножество синтаксиса AspectJ (как указывает сообщение), он поддерживает 'execute' и специальные« point »кнопки bean. Если вы хотите больше, вам придется использовать fullblown aspectj с загрузкой или компиляцией времени. –

+0

@ M.Deinum: Почему бы вам не преобразовать комментарий в ответ? Это правильно и заслуживает признания. ':-)' – kriegaex

ответ

1

Spring использует proxies применять АОП, весна может только бобы на основе прокси-пружинные. Класс, реализующий PrintStream, обычно не является фасонным компонентом с пружинной конфигурацией. Рядом с тем, что Spring AOP поддерживает только subset синтаксиса AspectJ (как указывает сообщение), он поддерживает (среди прочих) execution и специальные точечные bean.

Если вы хотите использовать больше возможностей (то есть call точечный разрез), вам необходимо будет использовать fullblown AspectJ с загрузкой или компиляцией во времени.

+0

Спасибо. Не могли бы вы взглянуть на мой ответ/следующий вопрос выше? –

+0

Нет. Если у вас есть другой вопрос, задайте другой вопрос (я также отметил ваш текущий ответ как таковой). –