AspectJ :如何限制针对哪些方面

AspectJ : how to limit which aspects are targeted

我正在尝试为大型 spring 引导项目的私有方法启用切面编织。我已经有针对 public 方法的方面工作得很好,但我的研究让我想到 Spring AOP 方面只能与 public 方法交互。

我遇到了这个项目,我已将其合并到我的代码中(字面意思是复制粘贴使用示例):

https://github.com/subes/invesdwin-instrument

这有数百个方面在启动时被针对的副作用(spring 主要是东西)。控制台消息如下所示:

 [Xlint:cantFindType]
[AppClassLoader@277050dc] error can't determine implemented interfaces of missing type javax.servlet.Filter
when processing declare parents org.springframework.web.filter.GenericFilterBean
when processing type mungers 
when weaving

如何将 aspectJ 配置为仅处理我正在创建的方面而忽略其余方面?

******更新******

我遵循了评论中的建议,现在我在启动时遇到以下异常:

 java.lang.IllegalStateException: ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader] does NOT provide an 'addTransformer(ClassFileTransformer)' method. Specify a custom LoadTimeWeaver or start your Java virtual machine with Spring's agent: -javaagent:org.springframework.instrument.jar

我需要同时添加 aspectjweaver 和 spring-instrument java 代理吗?

首先,您链接的项目依赖于您 运行 Oracle JVM。
事实上,它使用 sun.misc.unsafe class,从 JDK 9 (JPMS) 开始也更难使用。

无论如何,该项目会发现一个 META-INF/aop.xml 文件,它指向包含您的方面的 classes。该文件内容的示例可能是

<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver>
        <include within="your.package.aspects.*"/>
        <include within="your.package.one.*"/>
    </weaver>
    <aspects>
        <aspect name="your.package.aspects.YourClassAspect"/>
    </aspects>
</aspectj>

<weaver> 标签内,您定义了哪些 class 将被考虑编织。
然后,您的切入点会告诉 AspectJ 要编织哪些特定方法。

但请继续阅读。


我不建议使用该项目,特别是如果您 运行 是 Spring 的最新版本。

  • 附加 AspectJ aspectjweaver.jar(并且 可能 spring-instrument.jar,请参阅文档)代理
  • META-INF下定义一个aop.xml文件
  • 使用注释定义切入点
  • 如有必要(请参阅文档)添加 @EnableLoadTimeWeaving 注释

一切顺利。

如需进一步阅读,请参阅 AOP docs, and a couple of questions I asked some time ago, which produced a documentation update (see diff)。