Spring AOP: перехватывает внутренние закрытые вызовы методов (@EnableAspectJAutoProxy) - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно захватить частные методы внутренних вызовов.

Итак, мне нужно использовать ткачество аспекта в моем проекте весенней загрузки:

@Configuration
@EnableAspectJAutoProxy
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }

Мне нужно захватить @Service private выполнение метода:

package net.space.service;

// imports

@Service    
public class RepositoryService {
    private void privateMethod(String param) {
        /* Do something */
    }

    public void innerCaller() {
        this.privateMethod(null);
    }
}

ВАЖНО : privateMethod имеет значение private и вызывается только innerCaller.

Однако, совет никогда не достигается.Как я могу решить это?

Я также пробовал с этим pointcut:

@Pointcut(value = "execution(* privateMethod(..))")
public void privatePointcut() {
}

и совет:

@AfterReturning("privatePointcut()")
public void groupMetrics(JoinPoint point) throws Throwable {
    // Do something
}

Я также пробовал с:

@Pointcut(value = "execution(* net.space.service.RepositoryService.privateMethod(..))")
@Pointcut(value = "execution(* RepositoryService.privateMethod(..))")

РЕДАКТИРОВАТЬ

Я также пытался использовать @EnableLoadTimeWeaving:

org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем «loadTimeWeaver», определенного в ресурсе пути к классу [org / springframework / context / annotation / LoadTimeWeavingConfiguration.class]: Не удалось создать экземпляр компонента с помощью метода фабрики;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [org.springframework.instrument.classloading.LoadTimeWeaver]: фабричный метод loadTimeWeaver вызвал исключение;вложенное исключение - java.lang.IllegalStateException: ClassLoader [sun.misc.Launcher $ AppClassLoader] НЕ предоставляет метод addTransformer (ClassFileTransformer).Укажите пользовательский LoadTimeWeaver или запустите виртуальную машину Java с помощью агента Spring: -javaagent: org.springframework.instrument.jar по адресу org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod (ConstructorResolver.j)-5.0.8.RELEASE.jar: 5.0.8.RELEASE]

1 Ответ

0 голосов
/ 14 ноября 2018

Я получил ответ;

Spring AOP основан на прокси-сервере, но имеет ограничения в отношении закрытых методов;

Из-за природы платформы Spring AOP, основанной на проксиЗащищенные методы по определению не перехватываются ни для прокси-серверов JDK (если это не применимо), ни для прокси-серверов CGLIB (где это технически возможно, но не рекомендуется для целей AOP).Как следствие, любой данный pointcut будет сопоставляться только с общедоступными методами!

Если для перехвата требуются защищенные / закрытые методы или даже конструкторы, рассмотрите возможность использования собственного AspectJ-ткачества, управляемого Spring, вместо Spring-прокси на основе прокси.AOP Framework.Это представляет собой другой режим использования AOP с другими характеристиками, поэтому обязательно ознакомьтесь с ткачеством, прежде чем принимать решение.

Поэтому вам необходимо включить нативное ткачество AspectJ со следующим;

В представленном здесь примере используется конфигурация в стиле XML, также возможно настроить и использовать @AspectJ с конфигурацией Java.В частности, аннотация @EnableLoadTimeWeaving может использоваться в качестве альтернативы (подробности см. Ниже).

Так что вы можете попробовать;

@Configuration
@EnableLoadTimeWeaving
public class ApiConfiguration implements WebMvcConfigurer { /*...*/ }
...