【问题标题】:How can Spring AspectJ weaving work without the -javaagent vm option?如果没有 -javaagent vm 选项,Spring AspectJ 编织如何工作?
【发布时间】:2014-03-22 16:32:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: java aspectj spring-aop javaagents load-time-weaving


    【解决方案1】:

    我找到了一些关于加载java代理in this interesting blog post的信息。

    仪器代理 要启用 JVM 仪器,您必须 提供作为 JAR 文件部署的代理(或更多)。一个 JAR 文件清单中的属性指定代理类 将被加载以启动代理。

    有两种加载代理的方式:

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

    在 JVM 初始化后,代理类将由 系统类加载器。如果类加载器未能加载代理,则 JVM 将中止。 ...

    是的,我们非常欢迎官方文档/规范...

    编辑 1:最后我遇到了一些相关的官方文档:API Javadoc for dynamic loading an agent as described in the second bullet point: see here for VirtualMachine class and here for loadAgent method.

    编辑 2:另见 this other blog post。它清楚地解释了启动时静态加载javaagent运行时动态加载javaagent之间的区别。

    【讨论】:

      【解决方案2】:

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

      因此不再需要显式的 -javaagent 参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-18
        • 2022-01-22
        相关资源
        最近更新 更多