#spring #aop #aspectj #spring-insight
#spring #aop #aspectj #spring-insight
Вопрос:
Я хотел настроить большое количество классов для использования с Spring Insight, и вместо того, чтобы добавлять @InsightOperation вручную к методам, я написал аспект для аннотирования методов с использованием точечных сокращений.
Однако это не работает. Хотя ручное аннотирование влияет на ведение журнала трассировки Spring Insight, метод AspectJ не работает.
Есть ли что-то, что я здесь делаю неправильно? (Я декомпилировал классы после аспектизации и действительно нахожу аннотацию в методах класса)
Это фрагмент кода aspect:
declare @method :public * com.example.IExample.execute(..) : @InsightOperation;
Комментарии:
1. (Я декомпилировал классы после аспектизации и действительно нахожу аннотацию в методах класса Правильно ли я понимаю: аннотации присутствуют в файлах классов, но это все еще не работает?
2. Может ли быть так, что распределение времени загрузки (которое использует Spring Insight) игнорирует или не может обнаружить аннотацию, добавленную аспектом времени компиляции?
Ответ №1:
В документации Spring говорится следующее:
Использование аннотаций @Insight * необязательно. Они упрощают конечным пользователям определение пользовательских фреймов операций и конечных точек без необходимости создания подключаемого модуля. Поскольку для использования аннотаций требуется модификация кода конечного пользователя, они являются опцией для пользователей, которые не могут или не хотят писать аспекты.
http://static.springsource.com/projects/tc-server/2.5/devedition/htmlsingle/devedition.html
Похоже, единственный способ — написать пользовательский плагин
Ответ №2:
Возможно, что Insight LTW не распознает введенные вами аннотации. Мне придется копнуть глубже в этом.
Тем временем вы можете попробовать аннотацию более низкого уровня:
com.springsource.insight.collection.method.MethodOperationsCollected
Если вы посмотрите на плагин spring-core, вы увидите, что он делает нечто подобное:
public aspect RepositoryMethodOperationCollectionAspect {
declare @type: @Repository * : @MethodOperationsCollected;
}
Ответ №3:
Простой способ обойти это — вызвать другой метод из вашего метода aspect, чтобы продолжить выполнение точки соединения. Я только пытался вызвать статический метод в статическом классе. Смотрите ниже мой код для добавления @InsightOperation ко всей моей сериализации JSON.
Мой аспект:
@Aspect
public class JSONSerializerAspect {
@Around("call(* *.JSONSerializer.serialize(..)) amp;amp; args(target)")
public Object serialize(ProceedingJoinPoint joinPoint, Object target) throws Throwable {
return JSONSerializationWrapper.serialize(joinPoint, target);
}
}
Статический класс, который он вызывает:
public class JSONSerializationWrapper {
@InsightOperation(label = "JSON_SERIALIZATION")
public static Object serialize(ProceedingJoinPoint joinPoint, Object target) throws Throwable {
return joinPoint.proceed(new Object[]{target});
}
}
Я использую это сам и проверил, что это работает.