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

时间:2019-04-03 17:12:38

标签: java spring-boot aspectj spring-aop instrumentation

我正在尝试为大型spring boot项目上的私有方法启用方面编织。我已经有针对公共方法的方面工作正常,但是我的研究使我想到了Spring AOP方面只能与公共方法进行交互的想法。

我遇到了一个项目,该项目已合并到我的代码中(实际上是复制粘贴使用示例):

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

这具有成百上千个针对启动的方面(主要是春季的东西)的副作用。控制台消息如下:

 [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代理?

1 个答案:

答案 0 :(得分:0)

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

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

<!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>标记内,您将定义要考虑编织的类。
然后,您的切入点会告诉AspectJ编织哪些特定方法。

但请继续阅读。


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

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

你很高兴。

要进一步阅读,请参见AOP docs,以及我前一段时间提出的几个问题,这些问题产生了文档更新(请参见diff)。

AspectJ LTW (weaving) not working with Spring Boot
Spring AOP with AspectJ - Load time weaving doubts