суббота, марта 10, 2012

Используем AspectJ для логирования

Как залогировать свой код так, чтобы не превратить его в лапшу? Оптимально хотелось бы вообще не вносить никаких изменений в бизнес логику. Например у нас есть следующий код. Нам надо логировать входные и выходные данные метода  logic.

package com.bssys.aspect;

public class MainApp {

 private String account;

 public String logic(String account) {
  return "Hello:" + account;
 }
 public static void main(String arg[]) {
  MainApp mainApp = new MainApp();
  String request = "O-o";
  String response = mainApp.logic(request);
 }
}



Для этой цели идельно подходит AspectJ.
Сразу пишем аспект!
package com.bssys.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class EasyAspect {
 
 @Before("execution(* com.bssys.aspect.MainApp.logic(..))")
 public void beforePrintlnCall(JoinPoint joinPoint) {
        System.out.println(joinPoint.getArgs()[0]);
    }
 
 @AfterReturning(pointcut="execution(* com.bssys.aspect.MainApp.logic(..))", returning = "retVal")
 public void afterPrintlnCall(Object retVal) {
        System.out.println(retVal);
    }
}
Аннотация @Before задает точку прикрепления аспекта. Как не трудно догадаться аннотируемый метод будет вызываться перед выполнением метода com.bssys.aspect.MainApp.logic(..)
@Before("execution(* com.bssys.aspect.MainApp.logic(..))")
Аннотация @AfterReturning задает точку прикрепления аспекта. В метод помеченный этой аннотацией будет передаваться результат выполнения метода com.bssys.aspect.MainApp.logic(..)
@AfterReturning(pointcut="execution(* com.bssys.aspect.MainApp.logic(..))", returning = "retVal")
Теперь чтобы AspectJ мог использовать мой аспект необходимо в проекте создать xml-файл в каталоге META-INF.
<?xml version="1.0"?>
<aspectj>
    <aspects>
        <aspect name="com.bssys.aspect.EasyAspect">
    </aspect></aspects>
</aspectj>

Остался еще один момент, в настройках запуска приложения необходимо прописать следующие свойства, чтобы аспект мог работать -javaagent:lib/aspectjweaver.jar Ну а вот так выглядит вся структура проекта в Eclipse.

2 комментария:

Eugene комментирует...

сделал аспект. подгрузил аспектJ через мавен. создал мета инф. создал aop.xml

не создавал aop.out.xml

не знаю где указывать этот параметр для запуска (у меня IDEA)

не работает.

JSer комментирует...

В параметрах запуска. Фактически сделать следующее:
java -javaagent:lib/aspectjweaver.jar com.bssys.aspect.MainApp