Spring Framework和其他IoC容器的内部结构

2022-09-01 23:09:50

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

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

我相信有一些Java / JVM钩子可以让你按照某种标准预处理类,但我无法在文档上找到任何东西。

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


答案 1

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

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

虽然Spring本身不做字节码后处理,但你可以配置AspectJ编织代理,如果代理不能满足你,它应该在Spring上工作得很好。


答案 2

推荐