东营市建设局网站医院网站制作设计

张小明 2026/1/1 9:05:47
东营市建设局网站,医院网站制作设计,免费申请httq//网站?,wordpress 图片模糊Spring IoC容器的实现原理#xff1a;工厂模式 解析XML 反射机制。 我们给自己的框架起名为#xff1a;myspring#xff08;我的春天#xff09; 第一步#xff1a;创建模块myspring 采用Maven方式新建Module#xff1a;myspring打包方式采用jar#xff0c;并且引入do…Spring IoC容器的实现原理工厂模式 解析XML 反射机制。我们给自己的框架起名为myspring我的春天第一步创建模块myspring采用Maven方式新建Modulemyspring打包方式采用jar并且引入dom4j和jaxen的依赖因为要使用它解析XML文件还有junit依赖。?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.myspringframework/groupIdartifactIdmyspring/artifactIdversion1.0.0/versionpackagingjar/packagingdependenciesdependencygroupIdorg.dom4j/groupIdartifactIddom4j/artifactIdversion2.1.3/version/dependencydependencygroupIdjaxen/groupIdartifactIdjaxen/artifactIdversion1.2.0/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependency/dependenciespropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/properties/project第二步准备好我们要管理的Bean准备好我们要管理的Bean这些Bean在将来开发完框架之后是要删除的注意包名不要用org.myspringframework包因为这些Bean不是框架内置的。是将来使用我们框架的程序员提供的。packagecom.powernode.myspring.bean;/** * author 动力节点 * version 1.0 * className Address * since 1.0 **/publicclassAddress{privateStringcity;privateStringstreet;privateStringzipcode;publicAddress(){}publicStringgetCity(){returncity;}publicvoidsetCity(Stringcity){this.citycity;}publicStringgetStreet(){returnstreet;}publicvoidsetStreet(Stringstreet){this.streetstreet;}publicStringgetZipcode(){returnzipcode;}publicvoidsetZipcode(Stringzipcode){this.zipcodezipcode;}OverridepublicStringtoString(){returnAddress{citycity\, streetstreet\, zipcodezipcode\};}}packagecom.powernode.myspring.bean;/** * author 动力节点 * version 1.0 * className User * since 1.0 **/publicclassUser{privateStringname;privateintage;privateAddressaddr;publicUser(){}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.ageage;}publicAddressgetAddr(){returnaddr;}publicvoidsetAddr(Addressaddr){this.addraddr;}OverridepublicStringtoString(){returnUser{namename\, ageage, addraddr};}}第三步准备myspring.xml配置文件将来在框架开发完毕之后这个文件也是要删除的。因为这个配置文件的提供者应该是使用这个框架的程序员。文件名随意我们这里叫做myspring.xml文件放在类路径当中即可我们这里把文件放到类的根路径下。?xml version1.0 encodingUTF-8?beansbeaniduserBeanclasscom.powernode.myspring.bean.Userpropertynamenamevalue张三/propertynameagevalue20/propertynameaddrrefaddrBean//beanbeanidaddrBeanclasscom.powernode.myspring.bean.Addresspropertynamecityvalue北京/propertynamestreetvalue大兴区/propertynamezipcodevalue1000001//bean/beans使用value给简单属性赋值。使用ref给非简单属性赋值。第四步编写ApplicationContext接口ApplicationContext接口中提供一个getBean()方法通过该方法可以获取Bean对象。注意包名这个接口就是myspring框架中的一员了。packageorg.myspringframework.core;/** * author 动力节点 * version 1.0 * className ApplicationContext * since 1.0 **/publicinterfaceApplicationContext{/** * 根据bean的id获取bean实例。 * param beanId bean的id * return bean实例 */ObjectgetBean(StringbeanId);}第五步编写ClassPathXmlApplicationContextClassPathXmlApplicationContext是ApplicationContext接口的实现类。该类从类路径当中加载myspring.xml配置文件。packageorg.myspringframework.core;/** * author 动力节点 * version 1.0 * className ClassPathXmlApplicationContext * since 1.0 **/publicclassClassPathXmlApplicationContextimplementsApplicationContext{OverridepublicObjectgetBean(StringbeanId){returnnull;}}第六步确定采用Map集合存储Bean确定采用Map集合存储Bean实例。Map集合的key存储beanIdvalue存储Bean实例。MapString,Object在ClassPathXmlApplicationContext类中添加MapString,Object属性。并且在ClassPathXmlApplicationContext类中添加构造方法该构造方法的参数接收myspring.xml文件。同时实现getBean方法。packageorg.myspringframework.core;importjava.util.HashMap;importjava.util.Map;/** * author 动力节点 * version 1.0 * className ClassPathXmlApplicationContext * since 1.0 **/publicclassClassPathXmlApplicationContextimplementsApplicationContext{/** * 存储bean的Map集合 */privateMapString,ObjectbeanMapnewHashMap();/** * 在该构造方法中解析myspring.xml文件创建所有的Bean实例并将Bean实例存放到Map集合中。 * param resource 配置文件路径要求在类路径当中 */publicClassPathXmlApplicationContext(Stringresource){}OverridepublicObjectgetBean(StringbeanId){returnbeanMap.get(beanId);}}第七步解析配置文件实例化所有Bean在ClassPathXmlApplicationContext的构造方法中解析配置文件获取所有bean的类名通过反射机制调用无参数构造方法创建Bean。并且将Bean对象存放到Map集合中。/** * 在该构造方法中解析myspring.xml文件创建所有的Bean实例并将Bean实例存放到Map集合中。 * param resource 配置文件路径要求在类路径当中 */publicClassPathXmlApplicationContext(Stringresource){try{SAXReaderreadernewSAXReader();Documentdocumentreader.read(ClassLoader.getSystemClassLoader().getResourceAsStream(resource));// 获取所有的bean标签ListNodebeanNodesdocument.selectNodes(//bean);// 遍历集合beanNodes.forEach(beanNode-{ElementbeanElt(Element)beanNode;// 获取idStringidbeanElt.attributeValue(id);// 获取classNameStringclassNamebeanElt.attributeValue(class);try{// 通过反射机制创建对象Class?clazzClass.forName(className);Constructor?defaultConstructorclazz.getDeclaredConstructor();ObjectbeandefaultConstructor.newInstance();// 存储到Map集合beanMap.put(id,bean);}catch(Exceptione){e.printStackTrace();}});}catch(Exceptione){e.printStackTrace();}}第八步测试能否获取到Bean编写测试程序。packagecom.powernode.myspring.test;importorg.junit.Test;importorg.myspringframework.core.ApplicationContext;importorg.myspringframework.core.ClassPathXmlApplicationContext;/** * author 动力节点 * version 1.0 * className MySpringTest * since 1.0 **/publicclassMySpringTest{TestpublicvoidtestMySpring(){ApplicationContextapplicationContextnewClassPathXmlApplicationContext(myspring.xml);ObjectuserBeanapplicationContext.getBean(userBean);ObjectaddrBeanapplicationContext.getBean(addrBean);System.out.println(userBean);System.out.println(addrBean);}}通过测试Bean已经实例化成功了属性的值是null这是我们能够想到的毕竟我们调用的是无参数构造方法所以属性都是默认值。下一步就是我们应该如何给Bean的属性赋值呢第九步给Bean的属性赋值通过反射机制调用set方法给Bean的属性赋值。继续在ClassPathXmlApplicationContext构造方法中编写代码。packageorg.myspringframework.core;importorg.dom4j.Document;importorg.dom4j.Element;importorg.dom4j.Node;importorg.dom4j.io.SAXReader;importjava.lang.reflect.Constructor;importjava.lang.reflect.Method;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/** * author 动力节点 * version 1.0 * className ClassPathXmlApplicationContext * since 1.0 **/publicclassClassPathXmlApplicationContextimplementsApplicationContext{/** * 存储bean的Map集合 */privateMapString,ObjectbeanMapnewHashMap();/** * 在该构造方法中解析myspring.xml文件创建所有的Bean实例并将Bean实例存放到Map集合中。 * param resource 配置文件路径要求在类路径当中 */publicClassPathXmlApplicationContext(Stringresource){try{SAXReaderreadernewSAXReader();Documentdocumentreader.read(ClassLoader.getSystemClassLoader().getResourceAsStream(resource));// 获取所有的bean标签ListNodebeanNodesdocument.selectNodes(//bean);// 遍历集合这里的遍历只实例化Bean不给属性赋值。为什么要这样做beanNodes.forEach(beanNode-{ElementbeanElt(Element)beanNode;// 获取idStringidbeanElt.attributeValue(id);// 获取classNameStringclassNamebeanElt.attributeValue(class);try{// 通过反射机制创建对象Class?clazzClass.forName(className);Constructor?defaultConstructorclazz.getDeclaredConstructor();ObjectbeandefaultConstructor.newInstance();// 存储到Map集合beanMap.put(id,bean);}catch(Exceptione){e.printStackTrace();}});// 再重新遍历集合这次遍历是为了给Bean的所有属性赋值。// 思考为什么不在上面的循环中给Bean的属性赋值而在这里再重新遍历一次呢// 通过这里你是否能够想到Spring是如何解决循环依赖的实例化和属性赋值分开。beanNodes.forEach(beanNode-{ElementbeanElt(Element)beanNode;// 获取bean的idStringbeanIdbeanElt.attributeValue(id);// 获取所有property标签ListElementpropertyEltsbeanElt.elements(property);// 遍历所有属性propertyElts.forEach(propertyElt-{try{// 获取属性名StringpropertyNamepropertyElt.attributeValue(name);// 获取属性类型Class?propertyTypebeanMap.get(beanId).getClass().getDeclaredField(propertyName).getType();// 获取set方法名StringsetMethodNamesetpropertyName.toUpperCase().charAt(0)propertyName.substring(1);// 获取set方法MethodsetMethodbeanMap.get(beanId).getClass().getDeclaredMethod(setMethodName,propertyType);// 获取属性的值值可能是value也可能是ref。// 获取valueStringpropertyValuepropertyElt.attributeValue(value);// 获取refStringpropertyRefpropertyElt.attributeValue(ref);ObjectpropertyValnull;if(propertyValue!null){// 该属性是简单属性StringpropertyTypeSimpleNamepropertyType.getSimpleName();switch(propertyTypeSimpleName){casebyte:caseByte:propertyValByte.valueOf(propertyValue);break;caseshort:caseShort:propertyValShort.valueOf(propertyValue);break;caseint:caseInteger:propertyValInteger.valueOf(propertyValue);break;caselong:caseLong:propertyValLong.valueOf(propertyValue);break;casefloat:caseFloat:propertyValFloat.valueOf(propertyValue);break;casedouble:caseDouble:propertyValDouble.valueOf(propertyValue);break;caseboolean:caseBoolean:propertyValBoolean.valueOf(propertyValue);break;casechar:caseCharacter:propertyValpropertyValue.charAt(0);break;caseString:propertyValpropertyValue;break;}setMethod.invoke(beanMap.get(beanId),propertyVal);}if(propertyRef!null){// 该属性不是简单属性setMethod.invoke(beanMap.get(beanId),beanMap.get(propertyRef));}}catch(Exceptione){e.printStackTrace();}});});}catch(Exceptione){e.printStackTrace();}}OverridepublicObjectgetBean(StringbeanId){returnbeanMap.get(beanId);}}重点处理当property标签中是value怎么办是ref怎么办第十步打包发布将多余的类以及配置文件删除使用maven打包发布。第十一步站在程序员角度使用myspring框架新建模块myspring-test引入myspring框架的依赖?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.powernode/groupIdartifactIdmyspring-test/artifactIdversion1.0-SNAPSHOT/versionpackagingjar/packagingdependenciesdependencygroupIdorg.myspringframework/groupIdartifactIdmyspring/artifactIdversion1.0.0/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.13.2/versionscopetest/scope/dependency/dependenciespropertiesmaven.compiler.source17/maven.compiler.sourcemaven.compiler.target17/maven.compiler.target/properties/project编写Beanpackagecom.powernode.myspring.bean;/** * author 动力节点 * version 1.0 * className UserDao * since 1.0 **/publicclassUserDao{publicvoidinsert(){System.out.println(UserDao正在插入数据);}}packagecom.powernode.myspring.bean;/** * author 动力节点 * version 1.0 * className UserService * since 1.0 **/publicclassUserService{privateUserDaouserDao;publicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}publicvoidsave(){System.out.println(UserService开始执行save操作);userDao.insert();System.out.println(UserService执行save操作结束);}}编写myspring.xml文件?xml version1.0 encodingUTF-8?beansbeaniduserServiceBeanclasscom.powernode.myspring.bean.UserServicepropertynameuserDaorefuserDaoBean//beanbeaniduserDaoBeanclasscom.powernode.myspring.bean.UserDao//beans编写测试程序packagecom.powernode.myspring.test;importcom.powernode.myspring.bean.UserService;importorg.junit.Test;importorg.myspringframework.core.ApplicationContext;importorg.myspringframework.core.ClassPathXmlApplicationContext;/** * author 动力节点 * version 1.0 * className MySpringTest * since 1.0 **/publicclassMySpringTest{TestpublicvoidtestMySpring(){ApplicationContextapplicationContextnewClassPathXmlApplicationContext(myspring.xml);UserServiceuserServiceBean(UserService)applicationContext.getBean(userServiceBean);userServiceBean.save();}}
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

加强社区网站建设低代码开发平台是什么

陀螺和加表allan方差分析,并拟合出5个系数结果。实验室里刚测完一批光纤陀螺的原始数据,老张甩给我个U盘说:"这组加表和陀螺数据赶紧跑个Allan方差,下班前把拟合系数给我"。我看了眼墙上的挂钟——得,又得跟…

张小明 2025/12/28 4:39:12 网站建设

企业门户网站建设方案后台管理企业服务账号是什么

Linly-Talker:一张照片如何引爆虚拟主播的平民化革命? 在最近的一场CSDN技术论坛中,一个名为 Linly-Talker 的开源项目悄然走红。它没有炫目的发布会,也没有资本站台,却凭借“上传一张照片,3分钟生成会说话…

张小明 2025/12/23 18:22:42 网站建设

所有网站名称大全wordpress表白系统

突破城通网盘下载限制:高效直连解析技术方案 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 城通网盘作为广泛使用的云存储服务,其下载速度限制一直困扰着用户。本文介绍的开源城…

张小明 2025/12/23 18:22:40 网站建设

做明星粉丝网站邢台做网站可信赖

MQTT Explorer终极指南:从零掌握物联网消息可视化监控 【免费下载链接】MQTT-Explorer An all-round MQTT client that provides a structured topic overview 项目地址: https://gitcode.com/gh_mirrors/mq/MQTT-Explorer 在物联网设备数量激增的今天&#…

张小明 2025/12/23 19:52:56 网站建设

如何建设微信商城网站搭建网站免费

清华源镜像同步延迟?手动切换节点解决Qwen3-32B下载慢 在大模型研发的日常中,你是否经历过这样的场景:凌晨两点,服务器准备就绪,显卡空转,团队等着模型一跑起来就能开始调参——结果 huggingface-cli downl…

张小明 2025/12/23 19:52:52 网站建设

广东省自然资源厅地址怎么样做网站优化

QRC资源文件动态加载 Qt资源系统(QRC)是Qt框架中用于管理二进制资源的机制,通过XML文件描述资源路径,编译时打包到可执行文件中。动态加载QRC文件能提升灵活性和维护性。 基本用法 动态加载的核心是QResource类和QDir的addResourc…

张小明 2025/12/23 19:52:50 网站建设