AspectJ:如何限制目标的哪些方面

问题描述 投票:0回答:1

我正在尝试在大型Spring启动项目中为私有方法启用方面编织。我已经有针对公共方法的方面工作得很好,但我的研究使我认识到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只与我正在创建的方面一起工作而忽略其余的?

****** UPDATE ******

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

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

java spring-boot aspectj spring-aop instrumentation
1个回答
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,请参阅docs)代理
  • aop.xml下定义一个META-INF文件
  • 使用注释定义切入点
  • 如有必要(参见文档)添加@EnableLoadTimeWeaving注释

而你很高兴。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.