【问题标题】:Internals of Spring Framework and other IoC containersSpring Framework 和其他 IoC 容器的内部结构
【发布时间】:2010-09-18 19:23:56
【问题描述】:

我使用 spring 已经有一段时间了,但我一直想知道它是如何工作的,更具体地说,它们如何加载和编织仅使用接口或 @annotation 标记的 bean/类。

对于 xml 声明,很容易看到 spring 如何预处理我的 bean(它们是在 spring 读取的 xml 上下文中声明的),但是对于仅使用注释标记的类,我看不到它是如何工作的,因为我不要将任何代理传递给 jvm 左右。

我相信有一些 Java/JVM 钩子允许您按某种标准预处理类,但我无法在文档中找到任何内容。

有人可以指点我一些文档吗?这与 java.lang.instrument.ClassFileTransformer API 有关吗?

【问题讨论】:

    标签: java spring jvm internals


    【解决方案1】:

    实际上Spring默认没有 做任何字节码后处理 既不是 XML-,也不是 注释配置的bean。反而 相关的 bean 被包装成动态的 代理(参见例如 java.lang.reflect.Proxy 在 Java SDK)。动态代理包装 您使用和拦截的实际对象 方法调用,允许应用 AOP 建议。不同之处在于代理本质上是由框架创建的新的人工类,而编织/字节码后处理改变了现有的。如果不使用您提到的 Instrumentation API,后者是不可能的。

    对于注解,<context:component-scan> 标签的实现将扫描类路径以查找所有带有 Spring 注解的类,并为它们创建 Spring 元数据占位符。之后,它们被视为通过 XML 配置(或者更具体地说,两者被视为相同)。

    虽然 Spring 本身不进行字节码后处理,但如果代理不能满足您的要求,您可以配置 AspectJ 编织代理,该代理应该可以与 Spring 一起正常工作。

    【讨论】:

    • 谢谢,很好的回答!我对 spring 或任何其他框架如何在没有我将它们提供给容器的情况下访问我的类感到有点困惑,但现在它是有道理的 :)
    • 我要指出的是,使用 Proxy 意味着您必须对接口进行编码才能使用 Spring 而无需编织(Proxy 仅适用于接口)
    • 不。 JDK 代理仅适用于接口,CgLib 代理也适用于普通类。
    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多