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)。
我正在尝试为大型 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)。