- 浏览: 31607 次
- 性别:
- 来自: 北京
最新评论
-
java20009:
nice!
Java编程思想第四版 书中代码及练习题答案 -
bingyalengxuan:
刚好有书,嘿嘿,省的去找代码了,谢喽!
Java编程思想第四版 书中代码及练习题答案 -
zqb666kkk:
谢了
Java编程思想第四版 书中代码及练习题答案 -
zqb666kkk:
我遇到的问题是不能通过 request.getparamete ...
Struts2 action和jsp间传值问题 -
不吃鱼的猫:
跟我一样,主要是古典,后来疯狂听摇滚,建议买三表的欧美流行音乐 ...
JE 里有没喜欢摇滚的 Linkin Park
在学习Spring的过程中,为了更加透彻的理解IOC容器,在讲师的分析下,自我实践了一下IOC的模拟实现:
Class_1:核心的模拟IOC类,其中注释已经十分清晰
Class_2:辅助解析XML文件的工具类
Class_3:容器生成对象时用到的反射类
Class_4:测试类
配置文件:
Interfaces:定义的接口
Classes:接口对应的实现类
Class_1:核心的模拟IOC类,其中注释已经十分清晰
package com.java.mySpring; import java.util.HashMap; import java.util.Map; import com.java.util.AnalyzeXMLUtil; import com.java.util.ReflectHelper; /** * 实例说明:模拟IOC的原理 * * @author citizen * */ public class MyIOC { // 配置文件的绝对路径 private static final String XML_PATH = "F:/eclipse-jee-ganymede-SR2-win32(1)/project/MyIOC/src/beans.xml"; private Map<String, Object> beansMap = new HashMap<String, Object>();// 模拟存储对象的Map容器 /** * 创建IOC容器 * * @throws Exception */ private void creatIOC() throws Exception { // 取得配置文件中所有的bean,将id为key创建在Map中 String[] ids = AnalyzeXMLUtil.getAttributeValue(XML_PATH, "/beans/bean", "id"); for (int i = 0; i < ids.length; i++) { createBean(ids[i]); } } /** * 在容器初始化时,载入对象 * * @throws Exception */ @SuppressWarnings("static-access") public MyIOC() throws Exception { creatIOC(); } /** * 创建Bean在容器里 * * @param beanId * Bean的Id * @return * @throws Exception */ private Object createBean(String beanId) throws Exception { // TODO Auto-generated method stub String className = AnalyzeXMLUtil.getSingleAttributeValue(XML_PATH,"/beans/bean[@id='" + beanId + "']", "class"); Object[] args = new Object[0]; Object bean = null; // 如果已存在该对象,直接返回该对象 if (beansMap.containsKey(beanId)) { return beansMap.get(beanId); } else {// 如果不存在,创建对象 bean = ReflectHelper.newInstance(className, args); } //取得某一个Bean所有的属性名 String[] propNames = AnalyzeXMLUtil.getAttributeValue(XML_PATH,"/beans/bean[@id='" + beanId + "']/property", "name"); for (int j = 0; j < propNames.length; j++) { //取得某一个Bean对应的所有属性的值 String propValue = AnalyzeXMLUtil.getSingleAttributeValue(XML_PATH, "/beans/bean[@id='" + beanId + "']/property[@name='" + propNames[j] + "']", "value"); // 如果Bean的属性是基本类型,注入该属性值 if (propValue != null && propValue.length() > 0) { /* * Object[] setArgs = new Object[1]; setArgs[0] = propValue; * ReflectHelper.invokeMethod(bean, * ReflectHelper.getSetMethodNameByFieldName(propNames[j]), * setArgs); */ ReflectHelper.setFieldValue(bean, propNames[j], propValue); } // 如果Bean的属性是引用Bean,可能要递归创建依赖的Bean else { propValue = AnalyzeXMLUtil.getSingleAttributeValue(XML_PATH,"/beans/bean[@id='" + beanId + "']/property[@name='" + propNames[j] + "']", "ref"); Object dependBean = createBean(propValue);//递归调用 ReflectHelper.setFieldValue(bean, propNames[j], dependBean); } } if (!beansMap.containsKey(beanId)) { beansMap.put(beanId, bean); } return beansMap.get(beanId); } /** * 按ID取得bean * * @param beanId * @return */ public Object getBean(String beanId) { System.out.println("要取得的:" + beanId); return this.beansMap.get(beanId); } }
Class_2:辅助解析XML文件的工具类
package com.java.util; import java.io.File; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; /**辅助解析XML文件的工具类 * @author citizen * */ public class AnalyzeXMLUtil { /** * 获得指定元素的值 * * @param filename * xml文件的路径 * @param elementPath * 元素的xpath路径(例如"/aaa/bbb") * @return */ @SuppressWarnings("unchecked") public static String[] getElementValue(String filename, String elementPath) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); List<Element> list = doc.selectNodes(elementPath); String[] ret = new String[list.size()]; Iterator<Element> i = list.iterator(); int count = 0; while (i.hasNext()) { Element element = i.next(); ret[count++] = element.getText(); } return ret; } catch (Exception e) { return new String[0]; } } /** * 获得指定元素的值 * * @param filename * xml文件的路径 * @param elementPath * 元素的xpath路径(例如"/aaa/bbb") * @return */ public static String getSingleElementValue(String filename, String elementPath) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); Element element = (Element) doc.selectSingleNode(elementPath); return element.getText(); } catch (Exception e) { return ""; } } /** * 获得指定属性的值 * * @param filename * xml文件的路径 * @param attributePath * 属性的Xpath路径(例如"//@attr_name") * @return * @throws Exception */ @SuppressWarnings("unchecked") public static String[] getAttributeValue(String filename, String attributePath) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); List<Attribute> list = doc.selectNodes(attributePath); String[] ret = new String[list.size()]; Iterator<Attribute> i = list.iterator(); int count = 0; while (i.hasNext()) { Attribute attribute = i.next(); ret[count++] = attribute.getText(); } return ret; } catch (Exception e) { return new String[0]; } } /** * 获得指定属性的值 * * @param filename * xml文件的路径 * @param attributePath * 属性的Xpath路径(例如"//@attr_name") * @return * @throws Exception */ public static String getSingleAttributeValue(String filename, String attributePath) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); Attribute attribute = (Attribute) doc .selectSingleNode(attributePath); return attribute.getText(); } catch (Exception e) { return ""; } } /** * 获得指定属性的值 * * @param filename * xml文件的路径 * @param elementPath * 属性所在元素的xpath路径(例如"/aaa/bbb") * @param attributeName * 属性的名称 * @return * @throws Exception */ @SuppressWarnings("unchecked") public static String[] getAttributeValue(String filename, String elementPath, String attributeName) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); // System.out.println(elementPath + "[@" + attributeName + "]"); List<Element> list = doc.selectNodes(elementPath + "[@" + attributeName + "]"); String[] ret = new String[list.size()]; Iterator<Element> i = list.iterator(); int count = 0; while (i.hasNext()) { Element element = i.next(); ret[count++] = element.attribute(attributeName).getText(); } return ret; } catch (Exception e) { return new String[0]; } } /** * 获得指定属性的值 * * @param filename * xml文件的路径 * @param elementPath * 属性所在元素的xpath路径(例如"/aaa/bbb") * @param attributeName * 属性的名称 * @return * @throws Exception */ public static String getSingleAttributeValue(String filename, String elementPath, String attributeName) { try { File file = new File(filename); SAXReader saxReader = new SAXReader(); Document doc = saxReader.read(file); Element element = (Element) doc.selectSingleNode(elementPath + "[@" + attributeName + "]"); return element.attribute(attributeName).getText(); } catch (Exception e) { return ""; } } }
Class_3:容器生成对象时用到的反射类
package com.java.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class ReflectHelper { /** * 获得对象的实例变量值 * * @param owner * 对象实例 * @param name * 实例变量的名称 * @return 返回实例变量的值 */ public static Object getProperty(Object owner, String name) throws Exception { Class ownerClass = owner.getClass(); Field field = ownerClass.getField(name); return field.get(owner); } /** * 获得类的静态变量值 * * @param className * 类的名称(包含包路径) * @param fieldName * 静态变量的名称 * @return 返回静态变量的值 * @throws Exception */ public static Object getStaticProperty(String className, String fieldName) throws Exception { Class classInfo = Class.forName(className); Field field = classInfo.getField(fieldName); return field.get(null); } /** * 执行实例对象的方法 * * @param owner * 实例对象 * @param methodName * 方法名称 * @param args * 方法的参数 * @return 返回所执行方法的返回值 * @throws Exception */ public static Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0; i < args.length; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args); } /** * 调用静态方法 * * @param className * 类的名称(包含包路径) * @param methodName * 静态方法的名称 * @param args * 方法的参数 * @return 执行静态方法的返回值 * @throws Exception */ @SuppressWarnings("unchecked") public static Object invokeStaticMethod(String className, String methodName, Object[] args) throws Exception { Class ownerClass = Class.forName(className); Class[] argsClass = new Class[args.length]; for (int i = 0; i < args.length; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(null, args); } /** * 创建一个新实例 * * @param className * 类的名称(包含包路径) * @param args * 构造器的参数 * @return 返回新创建的实例对象 * @throws Exception */ @SuppressWarnings("unchecked") public static Object newInstance(String className, Object[] args) throws Exception { Class newObjClass = Class.forName(className); if (args != null) { Class[] argsClass = new Class[args.length]; for (int i = 0; i < args.length; i++) { argsClass[i] = args[i].getClass(); } Constructor cons = newObjClass.getConstructor(argsClass); return cons.newInstance(args); } else { Constructor cons = newObjClass.getConstructor(null); return cons.newInstance(args); } } /**给没有set方法的属性赋值 * @param object * @param fieldName * @param value * @throws SecurityException * @throws NoSuchFieldException * @throws IllegalArgumentException * @throws IllegalAccessException */ public static void setFieldValue(final Object object,final String fieldName,final Object value) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException{ Field field=object.getClass().getDeclaredField(fieldName); field.setAccessible(true); field.set(object, value); } @SuppressWarnings("unused") private static String getMethodNameByFieldName(String fieldName) { return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); } }
Class_4:测试类
package test; import com.java.interfaces.Car; import com.java.interfaces.Wheel; import com.java.mySpring.MyIOC; public class TestMyIOC { public static void main(String args[]) throws Exception { MyIOC myIOC = new MyIOC(); Car car1 = (Car) myIOC.getBean("carImpl"); car1.setColor("green"); Wheel wheel = (Wheel) myIOC.getBean("wheelImpl"); System.out.println("对象的信息:"+car1.getId() + " " + car1.getColor() + " " + car1.getWheel().getId() + " " + car1.getWheel().getSize()); System.out.println("wheel.hashCode()" + wheel.hashCode()); System.out.println("结束"); } }
配置文件:
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="carImpl" class="com.java.beans.CarImpl"> <property name="id" value="001" /> <property name="color" value="red" /> <property name="wheel" ref="wheelImpl"/> </bean> <bean id="wheelImpl" class="com.java.beans.WheelImpl"> <property name="id" value="001" /> <property name="size" value="50cm" /> </bean> </beans>
Interfaces:定义的接口
package com.java.interfaces; import com.java.beans.WheelImpl; public interface Car { void setId(String id); String getId(); void setColor(String color); String getColor(); void setWheel(WheelImpl wheel); WheelImpl getWheel(); }
package com.java.interfaces; public interface Wheel { void setId(String id); void setSize(String size); }
Classes:接口对应的实现类
package com.java.beans; import com.java.interfaces.Car; public class CarImpl implements Car { private String id; private String color; private WheelImpl wheel; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public WheelImpl getWheel() { return wheel; } public void setWheel(WheelImpl wheel) { this.wheel = wheel; } }
package com.java.beans; import com.java.interfaces.Wheel; public class WheelImpl implements Wheel { private String id; private String size; @Override public void setId(String id) { // TODO Auto-generated method stub this.id = id; } @Override public void setSize(String size) { // TODO Auto-generated method stub this.size = size; } public String getId() { return this.id; } public String getSize() { return this.size; } }
相关推荐
**Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...
模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object> beans = new HashMap, Object>...
要模拟Spring的IOC容器,我们需要实现以下几个核心功能: - **Bean定义(Bean Definition)**:存储对象的创建信息,如类名、属性值、依赖关系等。 - **Bean工厂(Bean Factory)**:负责读取Bean定义,并根据定义...
在这个例子中,我们将通过导入Excel数据来深入理解Spring IOC的工作原理,并探讨如何自定义实现。 1. **控制反转**:在传统的编程模式中,我们经常手动创建和管理对象,但在Spring中,对象的创建、初始化、依赖关系...
Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...
本篇文章将深入探讨Spring实现原理,阐述IoC容器的优点,并指导如何在Eclipse中创建一个Spring的Web应用。 首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的...
本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...
在Spring中,IOC主要通过以下几种方式实现: 1. **依赖注入(Dependency Injection, DI)**:这是IOC的核心。Spring容器根据配置信息,将对象所需依赖的对象实例注入到该对象中,而不是由对象自行创建。DI可以通过...
在本文中,我们将深入探讨Spring IOC的实现原理,并通过一个简单的示例来展示其工作流程。 首先,我们需要理解什么是控制反转。在传统的编程模式中,程序员手动创建并管理对象,而Spring IOC则将这种控制权反转,由...
浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...
在Java开发领域,Spring...通过这个模拟项目,开发者可以深入了解Spring IoC的基本原理,学习如何在没有Spring框架的情况下手动管理对象的生命周期和依赖关系,这对于理解Spring框架的工作机制和优化代码结构大有裨益。
Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC(Inversion of Control,控制反转)实现原理之 IOC 初始化流程。IOC 是一种软件设计模式,用于将软件系统中...
在Spring框架中,IoC(Inversion of Control)容器是其核心特性之一,它负责管理对象的生命周期和依赖关系。IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试...
**Spring的IOC原理详解** **一、IoC理论背景** 在面向对象的软件设计中,对象间的耦合是不可避免的,它们通过相互合作实现业务逻辑。这种耦合就像机械手表中的齿轮,彼此啮合共同完成任务。随着软件系统规模的扩大...
通过实践,你可以深入了解Spring如何管理对象的生命周期,如何通过依赖注入来降低耦合,以及如何利用面向切面编程来实现代码的模块化和解耦。这些技能对于任何Java开发者来说都是至关重要的,尤其是在大型企业级应用...
在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大...
这是spring_ioc部分的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...
Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...