如果没有-javaagent vm选项,Spring AspectJ编织如何工作?

我知道Spring避免使用-javaagent vm选项以使其AspectJ加载时间编织工作,而是依赖于类加载器来启动代理。

我认为Java规范规定使用Java代理的唯一方法是通过-javaagent vm选项。

我错了吗? 有人可以指示我使用官方的Java规范/文档来澄清我的审讯吗?

我在这篇有趣的博文中找到了一些关于加载java代理的信息 。

检测代理程序要启用JVM检测,您必须提供部署为JAR文件的代理程序(或更多)。 JAR文件清单中的属性指定将加载以启动代理的代理类。

加载代理有两种方法:

  • 使用命令行界面:通过将此选项添加到命令行:-javaagent:jarpath [= options]其中jarpath是代理JAR文件的路径。 options是代理选项。 此交换机可以在同一命令行上多次使用,从而创建多个代理。 多个代理可能使用相同的jarpath。
  • 通过动态加载:JVM必须实现一种机制,以便在VM启动后的某个时间启动代理。 这样,工具可以将代理“附加”到正在运行的JVM(例如profilers或ByteMan)

JVM初始化后,代理类将由系统类加载器加载。 如果类加载器无法加载代理,则JVM将中止。 …

是的官方文档/规范将非常受欢迎……

编辑1 :最后我遇到了一些相关的官方文档:用于动态加载代理的API Javadoc,如上面的第二个要点所述:请参阅此处获取VirtualMachine类 , 此处查看loadAgent方法 。

编辑2 :另见其他博客文章 。 它清楚地解释了启动时javaagent的静态加载与 运行时javaagent的动态加载之间的区别

这里有一个库,它通过注入检测来在运行时初始化aspectj和spring-aspects: https : //github.com/subes/invesdwin-instrument

所以不再需要显式的-javaagent参数。