Spring AOP:捕获内部私有方法调用(@EnableAspectJAutoProxy)

时间:2018-11-14 11:15:33

标签: spring spring-boot spring-aop

我需要捕获私有的内部调用方法。

因此,我需要在我的spring-boot项目中使用Aspectj编织:

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

我需要捕获@Service 私有方法执行:

package net.space.service;

// imports

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

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

重要privateMethod私有,仅由innerCaller调用。

但是,从来没有得到建议。我该怎么解决?

我也尝试过这种切入点:

@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:在类路径资源[org / springframework / context / annotation / LoadTimeWeavingConfiguration.class]中创建名称为'loadTimeWeaver'的bean时出错:通过工厂方法实例化Bean失败;嵌套的异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.instrument.classloading.LoadTimeWeaver]:工厂方法'loadTimeWeaver'抛出了异常;嵌套异常是java.lang.IllegalStateException:ClassLoader [sun.misc.Launcher $ AppClassLoader]不提供'addTransformer(ClassFileTransformer)'方法。指定一个自定义的LoadTimeWeaver或使用Spring的代理启动Java虚拟机:-javaagent:org.springframework.instrument.jar       在org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590)〜[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]

1 个答案:

答案 0 :(得分:0)

我得到了答案;

Spring AOP是基于代理的,但是在非公共方法方面有局限性

  

由于Spring的AOP框架基于代理的性质,因此受到保护   根据定义,方法不会被拦截,JDK代理也不会   (不适用于)或CGLIB代理(适用于   技术上可行,但不建议用于AOP)。作为一个   结果,任何给定的切入点将与公共方法匹配   唯一!

     

如果您的拦截需求包括受保护/私有方法,甚至   构造函数,请考虑使用Spring驱动的本机AspectJ编织   而不是Spring的基于代理的AOP框架。这构成了   具有不同特征的不同AOP使用模式,因此请确保   在做出决定之前先使自己熟悉编织。

因此,您需要使用以下命令启用native AspectJ weaving

  

此处提供的示例使用XML样式配置,它也是   可以在Java配置中配置和使用@AspectJ。   具体来说,@EnableLoadTimeWeaving注释可以用作   替代(有关详细信息,请参见下文)。

所以你可以尝试一下

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