23

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

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

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

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

4

1 回答 1

32

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

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

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

于 2008-10-23T20:50:20.230 回答