我在 spring 中使用 AspectJ AOP。我不是在使用 spring AOP,而是在 spring 中使用 AspectJ AOP。
我正在使用加载时间编织。我的建议没有得到执行。任何线索都会有很大帮助。
@Aspect
public class ProfilingAspect {
@Around("methodsToBeProfiled()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("Hello #################");
return pjp.proceed();
}
@Pointcut("execution(public * com.core.search.domain.AIESearchDomainService.doSearch())")
public void methodsToBeProfiled() {
}
}
以下是我尝试运行建议的方法。
package com.core.search.domain;
public class AIESearchDomainService {
public SearchResponse doSearch() {
return null;
}
}
我已经使用下面的注释启用了加载时间编织。
@EnableLoadTimeWeaving
我还指定了用于启用加载时间编织器的 java 代理,如下所示。
-javaagent:"pathTo/spring-instrument-5.3.25.jar"
我还创建了 aop.xml 并将其保存在 /resources/META-INF 文件夹中。
<aspectj>
<weaver>
<!-- only weave classes in our application-specific packages -->
<include within="com.core.search.domain.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="package.for.ProfilingAspect"/>
</aspects>
</aspectj>
代码没有错误,但我的建议没有得到执行。请帮忙。我相信编织正在发生,因为我能够看到以下日志。
[AppClassLoader@18b4aac2] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
我猜你忘了启用 aspectjWeaving 参数
@EnableLoadTimeWeaving(aspectjWeaving=ENABLED)
不知何故,AOP 使用以下 aop.xml 文件。
<aspectj>
<weaver>
<!-- only weave classes in our application-specific packages -->
<include name="package.for.ProfilingAspect"/>
<include within="com.core.search.domain.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="package.for.ProfilingAspect"/>
</aspects>
</aspectj>
只要在 weaver 标签中包含 Aspect 类就可以了,我还不明白是怎么做到的。
希望这有帮助!!