我正在尝试为大型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代理?
答案 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的最新版本。
就
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