Записки юного джависта 2 Создаем свою аннотацию для логирования
Всем привет
Я давно не писал о java "вещах".
Итак, начнем, для своего проекта мне понадобилось логировать методы. Согласитесь не всегда удобно писать вот такие строчки
Есть много минусов такой реализации, предлагаю о плюсах и минусах поговорить в комментариях =).
И так давайте создадим библиотеку которая будет логировать наши методы сама.
Создаем новый Maven проект. Тут все просто мы это уже проходили =)
Добавляем в проект нашу новую аннотацию. Я ее назвал Loggable. У аннотацию могут быть как обязательные поля так и не обязательные. поля Для не обязательных нужно указывать значение по умолчанию через ключевое слово default.
Пример:
public @interface Loggable {
String name();
String type() default “simple type”;
}
Поле name обязательное, а type нет.
Парадокс, но саму аннотацию мы помечаем другими аннотациями=)
- @Retention - указывает жизненный цикл нашей аннотации
- @Target - указывает, что можно помечать этой аннотацией
- @Component - указывает, что Spring позволит искать бины-сервисы автоматически, через autoscan.
- @Documented - указывает, что для аннотации будет сгенерирована документации JavaDoc. По умолчанию информация о аннотацие не добавляется в документацию JavaDoc.
Добавляем вспомогательный класс для распределения уровней логирования. Я думаю с этим классом вопросы не возникнут просто распределяем уровень логирования.
А теперь самое сложное, это научиться обрабатывать аннотацию. Создадим аспекта в стиле @AspectJ
Для этого помечаем аннотацией @Aspect - указывает, что является аспектом.
Далее метод around помечаем @Around с параметром "@within(ru.maksimov.andrey.log.Loggable) || @annotation(ru.maksimov.andrey.log.Loggable)"
- указывает, что методом around обернут любой метод с аннотацией "Loggable".
Сначала получаем параметры нашей аннотации.
Method method = signature.getMethod();
Loggable loggableMethod = method.getAnnotation(Loggable.class);
Loggable loggableClass = proceedingJoinPoint.getTarget().getClass().getAnnotation(Loggable.class);
LogLevel logLevel = loggableMethod != null ? loggableMethod.value() : loggableClass.value();
boolean showParams = loggableMethod != null ? loggableMethod.params() : loggableClass.params();
Формируем строку записываем имя метода и параметры
if (showParams && proceedingJoinPoint.getArgs() != null && proceedingJoinPoint.getArgs().length > 0) {
sb.append('(');
for (int i = 0; i< proceedingJoinPoint.getArgs().length; i++) {
sb.append(method.getParameterTypes()[i].getName() + ":" + proceedingJoinPoint.getArgs()[i]);
if (i< proceedingJoinPoint.getArgs().length - 1) {
sb.append(", ");
}
}
sb.append(')');
} else {
sb.append("()");
}
Далее фиксируем время старта, выполняем метод и фиксируем время завершения метода.
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
long endTime = System.currentTimeMillis();
Формируем строчку в лог с завершением метода. Если есть результат и в параметрах аннотации мы указывали что нужно выводить результат метода, то выводим еще и результат.
Вот и все. Теперь можно использовать нашу аннотацию =)
Ссылка на репозиторий
Примеры
А вот логи...