AspectJ加载时间编织不适用于Spring bean

Ale*_*ian 7 java configuration aop spring aspectj

我正在开发一个项目,它使用Spring配置的Java(而不是xml)风格来连接依赖项.它还具有应通过AspectJ编织到所需方法(通过注释)的分析逻辑.设置工作正常,我可以看到我所需的包中的类被编织,并从中记录出分析信息.

问题是编织不适用于@Bean类.我在启动时启用了调试aop.xml:

<weaver options="-XnoInline -Xreweavable -verbose -debug -showWeaveInfo">
Run Code Online (Sandbox Code Playgroud)

我可以看到我所需的包中的类被编织,但不是配置中的bean.如果我直接实例化类(不注入它们)编织工作.

不幸的是,我不能在这里发布实际代码,但这里有一个愚蠢的例子:

@Configuration
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED)
public class MySpringConfig {
    @Bean
    AnnotatedClass1 annotatedClass1() {
        return new AnnotatedClass1(new AnnotatedClass2());
    }
}
Run Code Online (Sandbox Code Playgroud)

AnnotatedClass1并且AnnotatedClass2直接实例化的同一个包和编织工作,而不是bean返回的那个.

我搜索过Spring AOP文档,但我似乎无法找到与此相关的任何内容.你需要做一些神奇的自动代理和SpringAOP的一些限制,但加载时间编织应该尽可能地工作 - 我已经尝试过私有方法,例如它有效.

Ale*_*ian 3

问题是返回类型 - 如果我这样做:

\n\n
@Bean\nObject annotatedClass1() {\n    return new AnnotatedClass1(new AnnotatedClass2());\n} \n
Run Code Online (Sandbox Code Playgroud)\n\n

编织也开始对豆子起作用。我最初的假设是它与 Spring 缓存 bean 而不是使用编织版本有关,但这没有\xe2\x80\x99t 有意义,因为:

\n\n
    \n
  • 加载时间编织应该在 xe2x80xa6 类加载时间起作用:)。然后,方法返回什么并不重要,类应该具有方面。
  • \n
  • 我\xe2\x80\x99实际上检查了Spring和AspectJ的调试输出,并且没有提到我的类,所以它一定被忽略了。
  • \n
\n\n

这是我第一次使用这个东西,所以我可能会误解一些东西。如果有人能解释为什么该@Bean方法的返回类型与编织有关,我\xe2\x80\x99d很乐意接受你的答案,而不是这个答案。

\n

  • 加载时编织,顾名思义,作用于加载类。现在,当返回时间为“AnnotatedClass1”时,这也会导致急切地加载该类,当返回时间为“Object”时,加载将被推迟到实际需要时为止。现在,由于急切加载,在加载时间编织器可以完成其工作之前,类已经加载了。 (4认同)