我一直在使用spring一段时间,但我总是想知道它是如何工作的,更具体地说,它们如何加载和编织只用接口或@annotation标记的bean /类.
对于xml声明,很容易看出spring如何预处理我的bean(它们是在spring读取的xml上下文中声明的),但是对于仅标注注释的类,我看不出它是如何工作的,因为我没有将任何代理传递给jvm左右.
我相信有一些Java/JVM钩子允许你通过某种标准预处理类,但我无法在文档上找到任何东西.
有人能指点我一些文件吗?这与java.lang.instrument.ClassFileTransformer API有关吗?
实际上,默认情况下,Spring既不对XML-也不对注释配置的bean进行任何字节码后处理.相反,相关的bean被包装到动态代理中(参见例如
java.lang.reflect.Proxy
Java SDK中).动态代理包装您使用的实际对象并拦截方法调用,允许应用AOP建议.不同之处在于代理本质上是由框架创建的新的人工类,而编织/字节码后处理会改变现有的类.如果不使用您提到的Instrumentation API,后者是不可能的.
至于注释,
tag 的实现将使用Spring注释扫描所有类的类路径,并为它们创建Spring元数据占位符.之后,它们被视为通过XML配置(或者更具体地说两者都被视为相同).
虽然Spring本身不进行字节码后处理,但是如果代理不满足你的话,你可以配置应该与Spring一起工作的AspectJ编织代理.