Я использую плагин AspectJ Maven для создания своего проекта и использую AspectLibrary, которая является jar, в которой я определил свои аспекты.
Вот аспект, который я пытаюсь использовать
@Around("execution(* *(..))&&@annotation(com.cisco.commerce.pricing.lp.commons.util.annotations.TimeMe)")
public Object timeMeAroundAspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {// NOSONAR
Timer timer = Timer.instance().start();
MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = signature.getMethod();
TimeMe timeMeAnnotation = method.getAnnotation(TimeMe.class);
String name = timeMeAnnotation.name();
boolean log = timeMeAnnotation.log();
boolean addToMetrics = timeMeAnnotation.addToMetrics();
Object response = null;
try {
response = proceedingJoinPoint.proceed();
} finally {
try {
Long timeTaken = timer.timeTaken();
if (log) {
LOGGER.info("MethodName: {} Time taken: {}", name, timeTaken);
}
if (addToMetrics) {
ExecutionDetailsUtil.addMethodExecutionTime(name, timeTaken);
}
} catch (Exception e) {
LOGGER.warn("Exception while trying to log time", e);
}
}
return response;
}
Этот код находится в jar-файле, который я использую в качестве аспекта-библиотеки в моем pom
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<encoding>UTF-8</encoding>
<source>${java.source-target.version}</source>
<target>${java.source-target.version}</target>
<Xlint>ignore</Xlint>
<aspectLibraries>
<aspectLibrary>
<groupId>it.cvc.ciscocommerce.lps.lp-commons</groupId>
<artifactId>lp-commons</artifactId>
</aspectLibrary>
</aspectLibraries>
<complianceLevel>${java.source-target.version}</complianceLevel>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
Ниже приведено определение моей аннотации
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface TimeMe {
public String name();
public boolean log() default true;
public boolean addToMetrics() default true;
}
Вотфрагмент, где я пытаюсь использовать эту аннотацию (в другой кодовой базе, которая использует вышеупомянутый jar в качестве зависимости)
@TimeMe(name = "classifyLine")
private void classifyLine(PricingObject pricingObject,
PricingLineObject pricingLineObject, LineTypes lineTypes) {
//logic
}
Моя сборка работает нормально и печатает следующее в консоли MAVEN
[INFO] точка соединения 'выполнение метода (void com.cisco.pricing.lps.main.ListPriceService.classifyLine (com.cisco.pricing.lps.bean.PricingObject, com.cisco.pricing.lps.bean.PricingLineObject, com.cisco.pricing.lps.dto.LineTypes)) 'in Type' com.cisco.pricing.lps.main.ListPriceService '(ListPriceService.java:235), советованный на основе рекомендаций от com.cisco.commerce.pricing.lp.commons.util.logging.LoggingAspectDefiner '(lp-commons-2019.03.01-SNAPSHOT.jar! LoggingAspectDefiner.class (из LoggingAspectDefiner.java))
Я взорвал файл войны и посмотрел на созданные файлы классов.У меня есть следующий класс AjcClosure1, сгенерированный для файла Java, в котором я использовал аннотацию.
public class ListPriceService$AjcClosure1 extends AroundClosure {
public Object run(Object[] paramArrayOfObject) {
Object[] arrayOfObject = this.state;
ListPriceService.classifyLine_aroundBody0((ListPriceService)
arrayOfObject[0],
(PricingObject)arrayOfObject[1],
(PricingLineObject)arrayOfObject[2], (LineTypes)arrayOfObject[3],
(JoinPoint)arrayOfObject[4]);return null;
}
public ListPriceService$AjcClosure1(Object[] paramArrayOfObject)
{
super(paramArrayOfObject);
}
}
А в файле класса Java, где я использую аннотацию, я не вижу изменений в методе classifyLine.
Однако, когда я запускаю свое приложение, аннотация не работает.Он не выполняет аспект, который я определил в банке.
Понятия не имею, почему.Мой шаблон не совпадает?Он подходит и отлично работает в приложении Spring, но не в этом приложении, отличном от Spring.