上海手机响应式网站建设设计,2345网址下载,厦门网络推广建网站,注册公司网上申请平台Spring框架的核心之一是IOC#xff0c;那么我们是怎么创建出来的Bean呢#xff1f; 作者进行了简单的总结#xff0c;希望能对你有所帮助。
IOC的创建并不是通过new而是利用了java的反射机制#xff0c;利用了newInstance方法进行的创建对象。 首先#xff0c;我们先定义…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类型。