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

张小明 2026/1/11 11:40:01
东营市建设局网站,医院网站制作设计,免费申请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进行投诉反馈,一经查实,立即删除!

公司域名费用每年多少钱南山网站 建设seo信科

Chrome扩展开发神器:40行代码实现热重载功能 【免费下载链接】crx-hotreload Chrome Extension Hot Reloader 项目地址: https://gitcode.com/gh_mirrors/cr/crx-hotreload 还在为Chrome扩展开发过程中频繁重启浏览器而烦恼吗?这款轻量级热重载工…

张小明 2026/1/2 9:30:06 网站建设

临清轴承网站建设网站备案更改吗

第一章:R语言在生物测序数据质控中的核心地位在高通量测序技术迅猛发展的背景下,生物测序数据的质量控制(Quality Control, QC)成为下游分析可靠性的关键前提。R语言凭借其强大的统计计算能力与丰富的生物信息学支持包&#xff08…

张小明 2026/1/2 10:10:45 网站建设

西安专业网站制作九一人才网招聘网官方网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个极简的HanLP演示应用,功能包括:1.输入文本自动分词并标注词性 2.高亮显示命名实体 3.简单的情感分析(笑脸/哭脸表情表示) 4.…

张小明 2025/12/22 17:34:14 网站建设

试卷a《网站建设与管理》百度关键词首页排名

如果你对SHEIN的印象还停留在“一家神秘的时尚独角兽”,那你可能已经错过了它的第二张面孔,也是更为硬核的一面:一家由技术深度驱动的产业互联网公司。通过技术与商业模式重新定义产业的底层逻辑,SHEIN构建了一套令业界惊叹的“自…

张小明 2025/12/22 17:33:13 网站建设

建设网站是做什么网页设计师培训大全

📈 算法与建模 | 专注PLC、单片机毕业设计 ✨ 擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。✅ 专业定制毕业设计✅ 具体问题可以私信或查看文章底部二维码智能家居安防报警系统是一个集成了多传感器…

张小明 2026/1/7 6:27:55 网站建设

公司免费建网站wordpress 主题添加标签

Mooncake终极指南:如何在5分钟内快速构建高性能LLM推理系统 【免费下载链接】Mooncake 项目地址: https://gitcode.com/gh_mirrors/mo/Mooncake Mooncake是由Moonshot AI开发的开源项目,专门为大规模语言模型推理提供KVCache中心化的去聚合架构。…

张小明 2025/12/22 17:31:11 网站建设