Я хочу использовать AOP, чтобы использовать пользовательскую аннотацию для перехвата методов и расчета времени их выполнения. Типичный вариант использования.
В частности, мне нужно иметь возможность профилировать ЛЮБОЙ метод, к которому я прикрепляю эту аннотацию. Это означает, что частные методы и методы, вызываемые из одного и того же класса.
Что я узнал
Я уже узнал, что в приложении Spring мне понадобятся некоторые дополнительные конфигурации, чтобы это работало, поскольку АОП Spring будет перехватывать только общедоступные методы в одном компоненте, вызываемые из другого компонента. Мне нужно будет настроить AspectJ AOP Within Spring и, видимо, также нужно будет настроить Load Time Weaving.
Вопрос в целом заключается в том, как мне это сделать. Ниже приведено все, что я знаю и уже сделал. Что работает, что нет, в чем я не уверен и все такое.
Вот что я уже сделал
ПРИМЕЧАНИЕ: я изменил некоторые ссылки и элементы исходного кода, чтобы сохранить общий вид. Поэтому, оценивая, что не так, имейте в виду, что некоторые проблемы компиляции могут быть связаны только с тем, что
- Я создал аннотацию
Код: Выделить всё
@Target({ ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) public @interface Profile { String value(); }
- Я создал аспект
Правильна ли эта настройка? Я видел другие структуры аспектов, использующие отдельный метод с @Pointcut("..."), а затем другой метод с @Around("ранее упомянутый метод()"). Я знаю, что моя установка работает с Spring AOP для общедоступных методов, вызываемых из другого bean-компонента.
Код: Выделить всё
@Component @Aspect public class ProfilerAspect { @Around("@annotation(Profile)") public void profile(ProceedingJoinPoint joinPoint) throws Throwable { // Do stuff joinPoint.proceed(); } }
Код: Выделить всё
Код: Выделить всё
@SpringBootApplication
@EnableLoadTimeWeaving
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Код: Выделить всё
- Я также пробовал указать InstrumentationLoadTimeWeaver
когда я это делаю, приложение запускается, но аннотация работает только для общедоступных методов, вызываемых из другого компонента - Есть ли мне следовало использовать другое пользовательское время загрузки Weaver?
Вот и все. Если не считать всяких тыканий и подтыканий, это, по сути, вся установка, которая у меня есть и которая не работает. В конце дня всегда происходит ошибка при запуске.
Код: Выделить всё
Caused by: java.lang.IllegalStateException: ClassLoader [org.springframework.boot.loader.LaunchedURLClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:spring-instrument-{version}.jar
Код: Выделить всё
-javaagent:path/to/spring-instrument.jar
- Нужно ли мне это делать?
Есть ли ЛЮБОЙ способ сделать это в коде, чтобы мне не приходилось изменять сценарии сборки (полностью управляемые другой командой)
[*]Как поместить jar в Docker-контейнер
[*]Как узнать путь из сборки сценарий
Источник: https://stackoverflow.com/questions/781 ... a-docker-c