`
直直走
  • 浏览: 31610 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring原理自我实践之IOC的模拟实现

阅读更多
    在学习Spring的过程中,为了更加透彻的理解IOC容器,在讲师的分析下,自我实践了一下IOC的模拟实现:
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;
	}

}
0
0
分享到:
评论

相关推荐

    springIoc实现原理

    **Spring Ioc 实现原理详解** Spring Ioc(Inversion of Control,控制反转)是Spring框架的核心特性之一,它改变了传统应用程序中对象的创建和管理方式。在传统的软件设计中,对象的创建和依赖关系的维护通常由...

    模拟实现Spring的IOC

    模拟实现__Spring的Ioc 1、Spring主要两个作用:实例化Bean,动态装配Bean。并将所有的bean放到spring容器中,调用时从容器中取。Spring容器就是一个bean的Map:private Map, Object&gt; beans = new HashMap, Object&gt;...

    模拟Spring的IOC

    要模拟Spring的IOC容器,我们需要实现以下几个核心功能: - **Bean定义(Bean Definition)**:存储对象的创建信息,如类名、属性值、依赖关系等。 - **Bean工厂(Bean Factory)**:负责读取Bean定义,并根据定义...

    SpringIOC原理实现

    在这个例子中,我们将通过导入Excel数据来深入理解Spring IOC的工作原理,并探讨如何自定义实现。 1. **控制反转**:在传统的编程模式中,我们经常手动创建和管理对象,但在Spring中,对象的创建、初始化、依赖关系...

    spring ioc和aop原理流程图(详细)

    Spring 框架是Java开发中的核心框架,它主要由两个关键部分组成:IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)。这两个概念是Spring框架的核心特性,极大地简化了企业...

    Spring实现原理及IoC容器的优点

    本篇文章将深入探讨Spring实现原理,阐述IoC容器的优点,并指导如何在Eclipse中创建一个Spring的Web应用。 首先,让我们理解Spring的核心——IoC容器。IoC是一种设计模式,它改变了对象获取依赖的方式。在传统的...

    以注解方式模拟Spring IoC AOP

    本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...

    SpringIOC和AOP实现机制模拟

    在Spring中,IOC主要通过以下几种方式实现: 1. **依赖注入(Dependency Injection, DI)**:这是IOC的核心。Spring容器根据配置信息,将对象所需依赖的对象实例注入到该对象中,而不是由对象自行创建。DI可以通过...

    Spring IOC实现原理demo

    在本文中,我们将深入探讨Spring IOC的实现原理,并通过一个简单的示例来展示其工作流程。 首先,我们需要理解什么是控制反转。在传统的编程模式中,程序员手动创建并管理对象,而Spring IOC则将这种控制权反转,由...

    浅谈 Spring 原理 透析,ioc aop

    浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...

    基于java简单模拟实现spring_ioc

    在Java开发领域,Spring...通过这个模拟项目,开发者可以深入了解Spring IoC的基本原理,学习如何在没有Spring框架的情况下手动管理对象的生命周期和依赖关系,这对于理解Spring框架的工作机制和优化代码结构大有裨益。

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    Spring 框架系列(7)- Spring IOC 实现原理详解之 IOC 初始化流程 本文将详细解释 Spring 框架中的 IOC(Inversion of Control,控制反转)实现原理之 IOC 初始化流程。IOC 是一种软件设计模式,用于将软件系统中...

    模拟Spring的IoC容器实现注解自动装配

    在Spring框架中,IoC(Inversion of Control)容器是其核心特性之一,它负责管理对象的生命周期和依赖关系。IoC容器通过控制反转的概念,将对象的创建和依赖关系的配置从应用代码中分离出来,使代码更加灵活、可测试...

    Spring的IOC原理

    **Spring的IOC原理详解** **一、IoC理论背景** 在面向对象的软件设计中,对象间的耦合是不可避免的,它们通过相互合作实现业务逻辑。这种耦合就像机械手表中的齿轮,彼此啮合共同完成任务。随着软件系统规模的扩大...

    模拟spring ioc过程

    通过实践,你可以深入了解Spring如何管理对象的生命周期,如何通过依赖注入来降低耦合,以及如何利用面向切面编程来实现代码的模块化和解耦。这些技能对于任何Java开发者来说都是至关重要的,尤其是在大型企业级应用...

    Spring IOC容器实现分析.pdf 下载

    在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以帮助开发者更好地利用这一强大...

    spring_ioc

    这是spring_ioc部分的内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...

    Spring的IoC实现案例

    在本文中,我们将深入探讨如何使用Spring的Inversion of Control(IoC)容器来实现一个具体的案例:控制打印机(Printer)类与不同类型的纸张(Paper)类的交互。Spring的IoC允许我们解耦组件,使代码更加灵活且易于...

    Spring中IoC优点与缺点解析

    Spring 中 IoC 优点与缺点解析 IoC(Inversion of Control)是 Spring 框架中的一种设计模式,它的主要思想是将对象的创建和管理交给容器,从而解耦合对象之间的依赖关系。今天,我们将详细解析 IoC 的优点和缺点。 ...

Global site tag (gtag.js) - Google Analytics