本文介绍: 介绍xml实现IOC的过程。我们通过new一个xml读取类,然后调用其中的方法进行注册容器。在getbean中,实现实例化。我们通过注册类拿到相关的信息然后利用反射class.forname拿到反射的字节文件,并利用newInstance方法对Bean实例化。

Spring框架的核心之一是IOC,那么我们是怎么创建出来的Bean呢?
作者进行了简单的总结,希望能对你有所帮助。

IOC的创建并不是通过new而是利用了java的反射机制,利用了newInstance方法进行的创建对象

首先,我们先定义一个类,叫PropertyValue,这个里面封装name,ref,value,就对应了我们在xml文件里的标签

其次,我们需要定义BeanDefinition(这只是一个接口,里面有很多继承关系去实现了这个类,这里为了方便理解,不深入说了,就当他是一个类),其中包含了idclassname等等。
在这里插入图片描述

然后,是一个注册类,实现了BeanDefinitionRegistry这个接口。这个类中将所有从之后在这里插入图片描述
我们将读到xmL文件信息中的bean信息全部注册到了这个里面。

其次,是xmlRead类,我们通过读取xml文件,将所有的bean信息全部注册进去。这里有一个小细节,我们在注册时候用的是classLoader的getSourceasStream方法,这是为什么呢?我们直接使用文件读取不好吗,为什么读一个文件还要这么麻烦呢。使用加载器的getResourcesAsStream方法可以使Spring不依赖文件操作系统的具体实现,从而可以简化跨操作系统应用部署。这种方式使得Spring框架可以在不同的操作系统平台上运行,而不需要修改代码以适应不同的操作系统。当然这只是其中的原因之一。
在这里插入图片描述

接着,我们定义一个工厂类,这个类就是实例化我们对象的核心
我们看一下继承关系
在这里插入图片描述
在这里插入图片描述
xmlapplicationcontext中就实现了xml文件读取进行bean实例化过程,这个过程我们通过new一个xml读取类,然后调用其中的方法进行注册容器。在getbean中,实现实例化。我们通过注册类拿到相关的信息,然后利用反射class.forname拿到反射的字节码文件,并利用newInstance方法对Bean实例化。然后我们需要对其进行赋值。那么我们就需要获得其中的初始化实例方法,这个实例化方法是怎么获得呢?
还记得在CGlib和JDK动态代理中我们一直提到的invoke方法嘛,它可以执行我们通过字节获取的Method(它是Method中的一个核心方法,用于执行获取到的方法)。
我们通过字符串拼接,因为我们都是驼峰命名所以一定可以预先知道set方法长啥样,我们拼接处方法的名字
接着通过如下方式执行
Method method = clazz.getMethod(methodName, String.class);
method.invoke(beanObj,value);
最后返回return clazz.cast(bean)就OK啦
PS:Class.cast(Object obj)方法 就是作用就是强制类型转换。将obj转化成T类型

原文地址:https://blog.csdn.net/qq_45816864/article/details/134600593

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_4139.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注