Сразу оговорюсь:
-
Spring AOP не подходит для этой цели потому что:
-
будет работать только на public методах
-
ввиду особенностей реализации не будет работать в методе вызванном из другого метода этого же сервиса.
-
-
материал небольшой для статьи потому что:
-
я так люблю излагать
-
в том же объеме это не влезает в пост
-
Зависимости
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.21</version> </dependency> <dependency> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.15.0</version> </dependency>
Плагин maven
<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.15.0</version> <configuration> <complianceLevel>11.0</complianceLevel> <source>11.0</source> <target>11.0</target> <showWeaveInfo>true</showWeaveInfo> <verbose>true</verbose> <Xlint>ignore</Xlint> <encoding>UTF-8 </encoding> <sources/> <forceAjcCompile>true</forceAjcCompile> <weaveDirectories> <weaveDirectory>${project.build.directory}/classes</weaveDirectory> </weaveDirectories> </configuration> <executions> <execution> <goals> <goal>compile</goal> </goals> </execution> </executions> </plugin> ...
Аннотация
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogTime { }
Создаем аспект
@Aspect @Slf4j public class LogTimeAspect { @Pointcut("@annotation(org.mypackage.subpackage.LogTime) && execution(* *(..))") public void callAtLogExecuting() { } @Around("callAtLogExecuting()") public Object aroundCallAt(final ProceedingJoinPoint pjp) throws Throwable { var startTime = System.currentTimeMillis(); Object retVal = pjp.proceed(); var elapsedTime = System.currentTimeMillis() - startTime; log.debug(pjp.getSignature().getName() + " elapsed " + elapsedTime); return retVal; } }
Используем аннотацию
@LogTime private yourMethod() { // method body }
Вешать аннотацию можно на методах с любой видимостью. Взято из работающего кода.
Статья Хабра 2013 года на ту же тему: https://habr.com/ru/articles/186940/