`
xiaoye4188
  • 浏览: 30931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

模拟Spring IOC

阅读更多

本模拟实现的功能:将如下xml文件中的bean加载进spring容器,同时将studentDao注入studentService中,最后通过getBean()获取bean


<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="studentDao" class="com.zju.test.StudentDao"></bean>
	
	<bean id="studentService" class="com.zju.test.StudentService" >
		<property name="studentDao" ref="studentDao"/>
	</bean>
</beans>


一、数据结构的定义:

Spring中用BeanDefinition数据结构封装数据

BeanDefinition类:


package com.zju.xiaoye.bean;

import java.util.ArrayList;
import java.util.List;

/**
 * BeanDefinition 的定义类
 * 
 * @author xiaoye
 * 
 */
public class BeanDefinition {
	private String id;   //bean id
	private String className; //bean className
	private List<PropertyDefinition> properties = new ArrayList<PropertyDefinition>();  //定义bean中property子节点

	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}

	public BeanDefinition() {
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}

	public List<PropertyDefinition> getProperties() {
		return properties;
	}

	public void setProperties(List<PropertyDefinition> properties) {
		this.properties = properties;
	}

}


 而PropertyDefinition定义如下:


package com.zju.xiaoye.bean;

public class PropertyDefinition {
	private String name;  //name属性
	private String ref;  //ref属性

	public PropertyDefinition(String name, String ref) {
		this.name = name;
		this.ref = ref;
	}

	public PropertyDefinition() {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getRef() {
		return ref;
	}

	public void setRef(String ref) {
		this.ref = ref;
	}

}



二、模拟容器的实现

模拟容器类MockSpringXmlApplicationContext主要的结构如下:

package com.zju.xiaoye.context;

import ......

public class MockSpringXmlApplicationContext {
	//BeanDefinition类型的List
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	
	//容器的主要数据结构beanDefinitionMap
	private Map<String, Object> beanDefinitionMap = new HashMap<String, Object>(); 
	
	/**
	 * MockSpringXmlApplicationContext构造函数
	 * 执行读取xml文件readXml(fileName);
	 * 初始化Beans方法initBeas();
	 * 实现依赖注入inject();
	 * @param fileName
	 */
	public MockSpringXmlApplicationContext(String fileName){
		this.readXml(fileName);
		this.initBeans();
		this.inject();
	}
	
	/**
	 * 读取xml文件信息进行解析
	 * 并将bean节点加入beanDefines中
	 * @param fileName
	 */
	private void readXml(String fileName){
		.......
	}
	
	/**
	 * 遍历beanDefines将bean加入map中
	 */
	private void initBeans(){
		......
	}
	
	/**
	 * 根据set方法实现依赖注入
	 * 遍历beanDefines集合,对每个beanDefinition,实现property节点的注入功能
	 */
	private void inject(){
		......
	}
	
	/**
	 * 根据id从容器中获取bean
	 * @param id
	 * @return
	 */
	public Object getBean(String id){
		return beanDefinitionMap.get(id);
	}
	
}

 下面介绍主要的方法实现

  1)readXml(String fileName):用dom4j来解析xml文件

private void readXml(String fileName){
		SAXReader saxReader = new SAXReader();
		Document document  = null;
		try {
			document = saxReader.read(new File(fileName));
			Element root = document.getRootElement();
			for(Iterator rootIter = root.elementIterator("bean"); rootIter.hasNext();){
				Element beanNode = (Element) rootIter.next();
				
				BeanDefinition beanDefinition = new BeanDefinition(beanNode.attributeValue("id"), beanNode.attributeValue("class"));
				
				for(Iterator beanIter = beanNode.elementIterator(); beanIter.hasNext();){
					Element property = (Element) beanIter.next();
					PropertyDefinition propertyDefinition = new PropertyDefinition(property.attributeValue("name"),property.attributeValue("ref"));
					beanDefinition.getProperties().add(propertyDefinition);
				}
				beanDefines.add(beanDefinition);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
 


2)initBeans()

private void initBeans(){
		for(BeanDefinition bean : beanDefines){
			if(bean.getClassName()!=null && !"".equals(bean.getClassName().trim())){
				try {
					beanDefinitionMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());//反射获取实例
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}



3)inject()

private void inject(){
		for(BeanDefinition beanDefinition : beanDefines){
			Object bean = beanDefinitionMap.get(beanDefinition.getId());
			if(bean!=null){
				try {
					PropertyDescriptor [] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					for(PropertyDefinition propertyDefinition : beanDefinition.getProperties()){
						for(PropertyDescriptor propertyDesc : ps){
							if(propertyDesc.getName().equals(propertyDefinition.getName())){
								Method setter = propertyDesc.getWriteMethod();//获取属性的set方法
								if(setter!=null){
									Object value = beanDefinitionMap.get(propertyDefinition.getRef());
									setter.setAccessible(true); //处理private
									setter.invoke(bean, value);//把引用对象注入到属性
								}
								break;
							}
						}
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}


分享到:
评论

相关推荐

    以注解方式模拟Spring IoC AOP

    模拟Spring的IoC,我们可以创建一个简单的容器类,其中包含一个Map来存储bean。然后使用注解处理器扫描带有特定注解(如`@Component`)的类,并将它们注册到容器中。当需要注入依赖时,容器可以解析注解并自动装配。...

    模拟spring ioc过程

    这个"模拟spring ioc过程"的学习例子是基于Java语言的,旨在帮助理解Spring框架中的这两个核心概念。在Java工程中,我们通常会通过配置文件(如XML或Java配置类)来定义bean的定义和它们之间的依赖关系。在实际运行...

    java模拟spring ioc

    这篇博客“java模拟spring ioc”很可能是探讨如何在没有Spring框架的情况下,使用纯Java代码来实现类似Spring的IOC功能。以下将详细介绍Spring的IOC和DI概念以及如何模拟这些概念。 **依赖注入(Dependency ...

    模拟spring IOC非常好的事例

    下面我们将深入探讨这个"模拟spring IOC非常好的事例"所涵盖的知识点。 首先,我们需要理解什么是IOC。IOC是一种设计模式,它的主要思想是将对象的创建和管理权交给一个外部容器,而不是由对象自身来负责。这样可以...

    模拟Spring IoC

    在这个模拟Spring IoC的项目中,我们可以深入理解以下几个关键知识点: 1. **容器的概念**:Spring IoC容器是管理对象及其依赖关系的核心组件。在这个模拟项目中,会有一个类或接口扮演容器的角色,负责创建对象、...

    模拟spring ioc技术

    本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...

    java练习之模拟SPRING IOC,我的SUMMER

    这个练习分为三个主要部分,旨在帮助我们掌握XML配置文件的读取,模拟Spring的IoC机制,以及对Struts框架的简单模拟。下面将逐一解析这些知识点。 **1. XML读取** XML(Extensible Markup Language)是一种通用的...

    简单模拟springIoc容器

    在`YQIoc`这个压缩包中,可能包含了实现简单模拟Spring IoC容器的代码。通常,这个模拟会包含以下几个部分: 1. **Bean定义**:这是描述对象如何创建和配置的数据结构。在我们的例子中,bean定义可能是以XML形式...

    模拟springIOC

    在本文中,我们将深入探讨“模拟Spring IOC”的概念,以及如何通过自己实现的简单依赖注入来理解这个核心的Spring框架特性。Spring IOC,即Inversion of Control(控制反转),是软件设计模式的一种,它在Spring框架...

    模拟Spring的IOC

    **模拟Spring的IOC** 在Java世界中,Spring框架以其强大的依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC)能力,成为企业级应用开发的首选框架之一。理解并模拟Spring的IOC...

    反射模拟springIOC.rar

    1. **配置文件解析**:在`springIOC_0602`项目中,我们有一个XML配置文件,它定义了bean的声明和它们的依赖。JDOM库被用来读取这个文件,解析bean的定义,包括bean的类名、属性、依赖等。 2. **Bean的创建**:解析...

    java 解析xml,模拟spring框架ioc

    本教程将深入探讨如何模拟Spring框架的IOC(Inversion of Control,控制反转)功能,特别关注XML配置文件的解析。 首先,我们需要理解什么是IOC。控制反转是一种设计原则,它将对象的创建和管理从对象本身剥离出来...

    使用Java注解模拟spring ioc容器过程解析

    使用Java注解模拟Spring IOC容器过程解析 Java注解是一种特殊的语法结构,用于提供元数据来描述程序元素,如类、方法、字段等。Spring框架的IOC(Inversion of Control,控制反转)容器是Spring框架的核心组件之一...

    SpringIoc示例代码

    Spring IOC,全称Inversion of Control,即“控制反转”,是Spring框架的核心特性之一。在传统的Java应用程序中,对象的创建和管理通常由开发者自己控制。而在Spring IOC中,这种控制权被反转,对象的创建、初始化、...

    模拟实现Spring的IOC

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

    spring IOC AOP simulation.rar

    总的来说,"spring IOC AOP simulation"这个项目为我们提供了一个动手实践的平台,通过模拟Spring的IoC和AOP,我们可以更直观地理解这两个概念,提高我们的Spring框架应用能力。通过编写和运行代码,我们可以看到...

    SpringIOC和AOP实现机制模拟

    Spring框架是Java开发中不可或缺的一部分,它通过提供控制反转(IOC)和面向切面编程(AOP)等核心特性,极大地简化了企业级应用的构建。让我们深入探讨这两个概念及其在Spring中的实现机制。 首先,Spring的控制...

    Spring IOC AOP MVC 简单例子

    例如,`SpringIOC`目录中的配置文件(如`applicationContext.xml`)用于定义bean的定义和它们之间的依赖关系。通过XML或注解方式声明bean,Spring可以自动管理bean的实例化、初始化和销毁,从而简化了代码并提高了可...

    spring IOC实现(墨者革离)

    在这个名为"spring_IOC实现(墨者革离)"的项目中,我们可以通过模拟城门叩问的编剧场景来理解这一概念。 首先,控制反转的基本思想是将对象的创建和依赖关系的管理从应用程序中分离出来,交给一个外部容器(在...

    模拟Spring的Ioc功能

    本篇文章将详细探讨如何利用jdom2解析XML文档以及通过反射机制来模拟Spring的IoC功能。 首先,理解IoC的基本概念。IoC意味着不再由应用程序直接创建对象,而是由一个容器(如Spring IoC容器)来负责对象的生命周期...

Global site tag (gtag.js) - Google Analytics