`
zhengshuo
  • 浏览: 137096 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring IOC 简易实现

阅读更多
    java的反射机制在java基础中是非常重要的,曾经有人说过:反射是评判一个java程序员的标准。足见反射机制在java的重要性!

    当今javaee编程,所有的框架都封装了许多我们看不到的代码,所有都做成了可配置的模式,这让许多程序员只懂得如何使用这些框架而忽略了很多实质性的东西,今日我的第一篇博文就主要是来谈论一些简单的反射与xml结合的强大功能。
   
    在web项目中,我们熟悉的ssh框架都有xml配置文件,拿spring来说,它配置一个bean实际上也用到了反射和xml,我花了一个下午的时间来做了一个实现配置bean的例子,供来客参考:
下面是反射实现的一个实例化对象的工具类
package refenceTest;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
public class RefenceUtils {
	/**
	 * @author 石叶
	 * @param RefenceUtils
	 * @param className 表示要创建类的类名(带包名)
	 * @param parameters 表示要创建类的属性和属性对应值的一个MAP 属性名为key,值为value组成
	 * @return 返回对应的class的实例
	 * @throws Exception
	 */
	public static Object getInstance(String className,Map<String,Object> parameters) throws Exception{
		/*
		 * 通过类名获得类的实例
		 */
		Object obj = Class.forName(className).newInstance();
		/* 通过传入的map 拿到所有要赋值的属性*/
		Set<String> set = parameters.keySet();
		for(String str :  set){
			/* 通过属性名的到对应的set方法名,这里必须保证set方法符合规范*/
			String methodName = "set"+str.substring(0, 1).toUpperCase()+str.substring(1);
			/*拿到set方法名对应的method*/
			Method m = obj.getClass().getMethod(methodName, obj.getClass().getDeclaredField(str).getType());
			/*执行这个set方法*/
			m.invoke(obj, parameters.get(str));
		}
		return obj;
	}
}

这个就是解析xml的类,将解析出来的参数通过反射实例化后保存到beanMap中
package xmlUtils;

import java.io.File;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import refenceTest.RefenceUtils;
/**
 * 用于解析xml的类,将解析的对象通过反射实例化后存放在beanMap中
 * @author 石叶
 *
 */
public class XmlLoad {
	/*用于存放实例对象的map*/
	private Map<String,Object> beanMap = new HashMap<String,Object>();
	/*xml文件*/
	private File resource;
	/*用dom4j中的SAXReader进行解析*/
	private SAXReader reader;
	/*解析中用到的document对象*/
	private Document document;
	public XmlLoad(){
		
	}
	/*通过构造实例化实例变量并完成解析*/
	public XmlLoad(File resource){
		this.resource = resource;
		try {
			reader = new SAXReader();
			document = reader.read(resource);
			this.loadObjectFromXml();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/*用于解析xml文件,实例化定义在xml中的变量,并存放在beanMap中*/
	private void loadObjectFromXml() throws Exception{
		Element root = document.getRootElement();
		Iterator rootIt = root.elementIterator();
		while(rootIt.hasNext()){
			Element classElement = (Element)rootIt.next();
			if("class".equals(classElement.getName())){
				Iterator classIt = classElement.attributeIterator();
				Map<String,Object> map = new HashMap<String,Object>();
				String refname = "";
				String className = "";
				String packageName = "";
				while(classIt.hasNext()){
					Attribute attri = (Attribute)classIt.next();
					if("type".equalsIgnoreCase(attri.getName())){
						className =  attri.getValue();
					}
					if("package".equalsIgnoreCase(attri.getName())){
						packageName = attri.getValue();
					}
					if("name".equalsIgnoreCase(attri.getName())){
						refname = attri.getValue();
					}
				}
				if(!"".equals(packageName.trim())&&!"".equals(className.trim())){
					className =  packageName+"."+className;
				}
				Element e = null;
				classIt = classElement.elementIterator();
				while(classIt.hasNext()){
					Element el = (Element)classIt.next();
					if("parameters".equals(el.getName())){
						e = el;
					}
				}
				Iterator it = e.elementIterator();
				while(it.hasNext()){
					Element element = (Element)it.next();
					Iterator attIt = element.attributeIterator();
					String name = "";
					String value = "";
					String ref = "";
					Object obj = null;
					while(attIt.hasNext()){
						Attribute attri = (Attribute)attIt.next();
						
						if("name".equals(attri.getName().trim())){
							name = attri.getValue();
						}
						if("value".equals(attri.getName().trim())){
							value = attri.getValue();
						}
						if("ref".equals(attri.getName().trim())){
							ref = attri.getValue();
							obj = beanMap.get(ref);
						}
					}
					if(null==obj){
						map.put(name, value);
					}else{
						map.put(name, obj);
					}
				}
				beanMap.put(refname,RefenceUtils.getInstance(className, map));
			}
		}
	}
	/*用于获得beanMap中的实例对象的入口*/
	public Object getBean(String key){
		return beanMap.get(key);
	}
	
	public File getResource() {
		return resource;
	}
	public void setResource(File resource) {
		this.resource = resource;
	}
	public Document getDocument() {
		return document;
	}
	public void setDocument(Document document) {
		this.document = document;
	}
	public SAXReader getReader() {
		return reader;
	}
	public void setReader(SAXReader reader) {
		this.reader = reader;
	}
}	

下面是供测试用的pojo
package pojo;
/**
 * 
 * @author 石叶
 *
 */
public class Person {
	/**
	 * 姓名
	 */
	private String name;
	/**
	 * 年龄
	 */
	private String age;
	/**
	 * 性别
	 */
	private String sex;
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return this.getClass().getName()+":"+this.getName()+":"+this.getAge()+":"+this.getSex();
	}
	public Person(String name, String age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	public Person() {
		super();
	}
}

package pojo;
/**
 * 账户类
 * @author 石叶
 *
 */
public class Account {
	/**
	 * 账户id
	 */
	private String id;
	/**
	 * 账户姓名
	 */
	private String username;
	/**
	 * 账户余额
	 */
	private String salary;
	/**
	 * 在此person并无实际意义,只是为了测试配置中的ref属性
	 */	
	private Person person;
	public Account() {
		super();
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public Person getPerson() {
		return person;
	}
	public Account(String id, String username, String salary, Person person) {
		super();
		this.id = id;
		this.username = username;
		this.salary = salary;
		this.person = person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
	public String getSalary() {
		return salary;
	}
	public void setSalary(String salary) {
		this.salary = salary;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	@Override
	public String toString() {
		return this.getClass().getName()+":"+
			this.getPerson().toString()+":"+this.getUsername()
			+":"+this.getSalary();
	}
	
	
}

package pojo;
/**
 * 桌子
 * @author 石叶
 *
 */
public class Desk {
	/**
	 *宽 
	 */
	private String widths;
	/**
	 * 高
	 */
	private String heigths;
	/**
	 * 长
	 */
	private String lengths;
	public String getHeigths() {
		return heigths;
	}
	public void setHeigths(String heigths) {
		this.heigths = heigths;
	}
	public String getLengths() {
		return lengths;
	}
	public void setLengths(String lengths) {
		this.lengths = lengths;
	}
	public String getWidths() {
		return widths;
	}
	@Override
	public String toString() {
		return this.getClass().getName()+":"+this.getLengths()+":"+this.getWidths()+":"+this.getHeigths();
	}
	public void setWidths(String widths) {
		this.widths = widths;
	}
	public Desk() {
		super();
	}
	public Desk(String widths, String heigths, String lengths) {
		super();
		this.widths = widths;
		this.heigths = heigths;
		this.lengths = lengths;
	}
}


下面是配置的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<classes>
	<class name="person" type="pojo.Person">
		<parameters>
			<parameter name="name" value="zhengshuo"/>
			<parameter name="age" value="21"/>
			<parameter name="sex" value="��"/>
		</parameters>
	</class>
	<class name="desk" type="pojo.Desk">
		<parameters>
			<parameter name="widths" value="100"/>
			<parameter name="heigths" value="120"/>
			<parameter name="lengths" value="100"/>
		</parameters>
	</class>
	<class name="account" type="pojo.Account">
		<parameters>
			<parameter name="username" value="֣˶"/>
			<parameter name="id" value="17"/>
			<parameter name="salary" value="1000"/>
			<parameter name="person" ref="person"/>
		</parameters>
	</class>
</classes>

测试类
package test;

import java.io.File;

import refenceTest.RefenceUtils;
import xmlUtils.XmlLoad;

public class Test {
	public static void main(String[] args) throws Exception {	//这里需要改为大家存放这个xml的路径
XmlLoad load = new XmlLoad(new File("d:/cvsroot/testrefence/src/pojo.xml"));
		Object obj = load.getBean("person");
		System.out.println(obj);
		obj = load.getBean("desk");
		System.out.println(obj);
		obj = load.getBean("account");
		System.out.println(obj);
	}

}


这个代码虽短,但是可以很好的理解spring的配置bean,这里要强调的是spring返回的是一个代理,然后实现aop,在这里我没有aop的实现,当然日后有时间我在修改的更加完善,欢迎大家提出宝贵的意见!
3
0
分享到:
评论
1 楼 caoxiaoj2ee 2011-06-25  
不错 楼主应该看过spring源码

相关推荐

    一个简单的模仿spring的ioc实现

    这个“一个简单的模仿spring的ioc实现”项目旨在帮助开发者理解Spring Ioc的核心概念,并通过自己的代码实现来加深对这一机制的理解。 首先,Spring Ioc的主要目标是解耦应用程序组件。它通过管理对象的生命周期和...

    手写spring ioc(三) 资源org.zip

    在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...

    动手写框架,模拟简易的SpringIOC.rar

    在我们的简易实现中,可能会有一个类扮演Bean工厂的角色,用于实例化和管理对象。 3. **ApplicationContext**:在Spring中,ApplicationContext扩展了BeanFactory,提供了更多企业级应用所需的功能,如资源加载、...

    自主实现的简易Spring框架

    本项目"自主实现的简易Spring框架"显然是对Spring核心功能的一种简化版实现,旨在帮助开发者深入理解Spring的核心机制。 首先,我们来讨论一下Spring的核心组件——IoC(Inversion of Control)容器。IoC也被称为...

    Spring.NET学习笔记-实现一个简易的IoC框架

    ### Spring.NET学习笔记-实现一个简易的IoC框架 #### 一、背景介绍与理论基础 在.NET领域中,Spring.NET框架是一个非常重要的轻量级框架,它支持依赖注入(Dependency Injection, DI)和面向切面编程(Aspect ...

    IOC容器简单实现

    **IOC容器简单实现** IOC(Inversion of Control)容器是软件设计模式中的一种,它将对象的创建和管理权从代码本身转移到一个外部容器,即IOC容器。这种反转控制使得程序更加灵活,降低了组件之间的耦合性,提高了...

    自己写的类struts的简易的mvc实现+一个类Spring的IOC和简单AOP

    在这个简易实现中,"Model"负责处理业务逻辑和数据存储,"View"负责显示用户界面,而"Controller"则作为两者之间的桥梁,接收用户请求,处理后转发到相应的视图或模型。 **简易MVC实现** 这个简易实现可能包括以下...

    模拟Spring架构的简易实现

    "模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...

    手写IOC,DI,servlet

    从【压缩包子文件的文件名称列表】"ShouXieMVC"来看,这可能是作者实现的一个简易的Model-View-Controller(MVC)架构。MVC是一种设计模式,常用于Web应用,它将业务逻辑(Model)、用户界面(View)和控制逻辑...

    简易实现Spring流程代码

    Spring框架是Java开发中广泛应用的一个开源框架,以其强大的IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)功能而著名。本篇文章将详细解析Spring框架的初始化过程,...

    仿 Spring 手写 IoC、AOP 框架.rar

    本教程将带你深入理解这两个概念,并通过手写一个简易的IoC和AOP框架来加深理解。 **依赖注入(IoC)** 依赖注入是Spring的核心特性之一,它允许开发者将对象的创建和管理权交给框架,从而降低组件之间的耦合度。在...

    针对大厂面试,模仿Spring写的简易版IOC小框架,完美解释三级缓存解决属性注入循环依赖的问题

    在这个名为"spring-simple-master"的压缩包中,包含了一个简易版的IOC(Inversion of Control,控制反转)小框架,其灵感来源于Spring的核心机制。这个项目特别关注如何使用三级缓存来解决属性注入过程中的循环依赖...

    手动实现一个ioc容器.zip

    在压缩包子文件"my-spring-ioc-master"中,可能包含了一个完整的示例项目,该项目演示了如何手动构建一个简易的Spring IOC容器。项目中可能包括以下部分: - **BeanDefinition**: 表示Bean定义的类,存储Bean的信息...

    简单Spring容器实现

    本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...

    【框架源码篇 01】Spring源码-手写IOC

    在本系列的第一篇中,我们将深入探讨Spring框架的核心特性——依赖注入(Dependency Injection,简称DI),并通过手动实现一个简易的IOC容器来理解其工作原理。Spring框架是Java开发中的基石,它提供了许多功能,如...

    struts2 hibernate spring整合 简易论坛开发

    Spring框架则是一个全方位的应用框架,它不仅提供了IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等核心特性,还集成了其他功能,如数据访问、事务管理、安全管理等。...

    java代码实现简易版IOC容器!.docx

    在这个简易版的Java IOC容器实现中,我们将探讨如何通过自定义注解和反射机制来构建一个基础的IoC容器。 首先,我们有两个自定义注解:`@MyComponent` 和 `@MyAutowired`。 1. `@MyComponent` 是一个类型注解,...

    coco-spring-ioc

    本文将围绕“coco-spring-ioc”项目,深入探讨这个简易版的Spring-ioc实现。 首先,理解IOC的概念是至关重要的。在传统的编程模式中,对象通常自行创建和管理它们所依赖的对象,而在IOC中,这种控制权被反转,由一...

Global site tag (gtag.js) - Google Analytics