石家庄园林绿化建设招标网站国外空间怎么上传网站
2026/5/23 15:38:53 网站建设 项目流程
石家庄园林绿化建设招标网站,国外空间怎么上传网站,宝宝个人网站模板,jsp做的网站答辩问题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();}}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询