Сразу оговорюсь:

  1. Spring AOP не подходит для этой цели потому что:

    1. будет работать только на public методах

    2. ввиду особенностей реализации не будет работать в методе вызванном из другого метода этого же сервиса.

  2. материал небольшой для статьи потому что:

    1. я так люблю излагать

    2. в том же объеме это не влезает в пост

Зависимости

<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/