Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架和其他IoC容器的内部构件_Java_Spring_Jvm_Internals - Fatal编程技术网

Java Spring框架和其他IoC容器的内部构件

Java Spring框架和其他IoC容器的内部构件,java,spring,jvm,internals,Java,Spring,Jvm,Internals,我使用spring已经有一段时间了,但我一直想知道它是如何工作的,更具体地说,它们是如何加载和编织只标记有接口或@annotation的bean/类的 对于xml声明,很容易看到spring如何预处理我的bean(它们是在spring读取的xml上下文中声明的),但是对于只标记了注释的类,我看不到它是如何工作的,因为我没有向jvm传递任何代理 我相信有一些Java/JVM钩子允许您根据某种标准预处理类,但我无法在文档中找到任何东西 有人能给我指一些文件吗?这与java.lang.instrume

我使用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
建议。不同之处在于代理本质上是由框架创建的新的人工类,而编织/字节码后处理改变了现有的类。如果不使用您提到的检测API,后者是不可能的

对于注释,
标记的实现将扫描带有Spring注释的所有类的类路径,并为它们创建Spring元数据占位符。之后,它们被视为是通过XML配置的(或者更具体地说,两者被视为相同的)


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

谢谢,回答得很好!我对spring或任何其他框架在不向容器提供类的情况下如何访问我的类感到困惑,但现在它是有意义的:)我应该指出,使用代理意味着必须对接口进行编码才能使用spring而不进行编织(代理只对接口起作用)不。JDK代理仅适用于接口,CgLib代理也适用于普通类。