`
在水伊方
  • 浏览: 110569 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Spring简单模拟Spring容器

 
阅读更多

续Spring之HelloWorld:http://huangminwen.iteye.com/admin/blogs/1040405

 

Spring容器启动后,首先读取spring.xml配置文件中的bean信息,然后再实例化该bean,所以我们就可以直接获取bean来使用了,而无需实例化,下面我们模拟一下Spring容器的工作原理,首先我们需要先读取spring.xml配置文件,然后再初始化bean标签页中的类,SimulateClassPathXMLApplicationContext说明了该过程:

package org.spring.junit;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;

public class SimulateClassPathXMLApplicationContext {
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	private Map<String, Object> sigletons = new HashMap<String, Object>();

	public SimulateClassPathXMLApplicationContext(String filename) {
		this.readXML(filename);
		this.instanceBeans(); 
	}
	
	/**
	 * 读取xml配置文件
	 * 
	 * @param filename
	 */
	private void readXML(String filename) {
		SAXReader saxReader = new SAXReader();
		Document document = null;

		try {
			URL xmlpath = this.getClass().getClassLoader()
					.getResource(filename);
			document = saxReader.read(xmlpath);

			Map<String, String> nsMap = new HashMap<String, String>();
			nsMap.put("ns", "http://www.springframework.org/schema/beans");// 加入命名空间

			XPath xsub = document.createXPath("//ns:beans/ns:bean");// 创建beans/bean查询路径
			xsub.setNamespaceURIs(nsMap);// 设置命名空间

			List<Element> beans = xsub.selectNodes(document);// 获取文档下所有bean节点

			// 将读取到的bean信息存入beanDefines中
			for (Element element : beans) {
				String id = element.attributeValue("id");// 获取id属性值
				String clazz = element.attributeValue("class"); // 获取class属性值
				BeanDefinition beanDefine = new BeanDefinition(id, clazz);
				beanDefines.add(beanDefine);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 完成bean的实例化
	 */
	private void instanceBeans() {
		for (BeanDefinition beanDefinition : beanDefines) {
			try {
				if (beanDefinition.getClassName() != null
						&& !"".equals(beanDefinition.getClassName().trim()))
					sigletons.put(beanDefinition.getId(),
							Class.forName(beanDefinition.getClassName())
									.newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 获取bean实例
	 * 
	 * @param beanName
	 * @return
	 */
	public Object getBean(String beanName) {
		return this.sigletons.get(beanName);
	}
}

 

其中BeanDefinition类如下:

package org.spring.junit;

/**
 * 用于存放spring.xml中bean标签的信息
 */
public class BeanDefinition {
	private String id; // spring.xml配置文件中bean节点的id属性
	private String className; // spring.xml配置文件中的bean节点的name属性

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

	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;
	}

}

 

控制台打印结果:Hello Spring World!

 

工程目录结构图

  • 大小: 13.7 KB
分享到:
评论

相关推荐

    简单Spring容器实现

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

    Spring容器的通俗理解及简单写法

    Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象间的依赖关系。在Java开发中,Spring容器(也称为ApplicationContext或BeanFactory)扮演着重要角色,它通过控制反转(Inversion of Control,...

    简单模拟springIoc容器

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

    自己动手模拟spring

    4. **Bean的生命周期管理**:Spring容器管理bean的完整生命周期,包括初始化、正常使用和销毁。在模拟中,我们需要实现类似的功能,如初始化方法调用、属性设置、销毁方法的执行等。 5. **IoC容器**:这是Spring的...

    模拟实现Spring的IOC

    2、本工程,模拟实现Spring的IOC,将xml中配置的Bean读入到Spring容器中,并在测试用例中调用Spring容器中的bean。 3、开发环境eclipse,jdk1.6。使用第三方jar包有:jdom.jar(用于解析xml文件),junit-4.4.jar...

    简单模拟Spring的beanFactory

    本文将通过模拟Spring的`BeanFactory`来深入理解其工作原理,帮助开发者更好地掌握Spring的核心概念。 `BeanFactory`是Spring框架中最基础的bean管理容器,它是所有更高级别的容器(如`ApplicationContext`)的基类...

    模拟Spring的IOC

    通过以上步骤,我们可以构建一个简单的IOC容器,模拟Spring的核心功能。这不仅有助于理解Spring的工作原理,也为我们自定义轻量级框架提供了可能。在实际开发中,了解并掌握Spring的IOC机制能够帮助我们更好地设计和...

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

    现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...

    以注解方式模拟Spring IoC AOP

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

    Java模拟spring实现

    在本文中,我们将探讨如何通过Java来模拟Spring框架的基本功能。Spring是一个广泛应用的开源框架,它主要为Java应用程序提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP...

    模拟Spring IoC

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

    基于java简单模拟实现spring_ioc

    2. **Bean定义**:每个对象在Spring容器中都有一个Bean定义,它包含了对象的类型、初始化方法、属性值等信息。在模拟实现中,可能会用Java类来表示这些信息。 3. **依赖解析**:Spring容器会根据Bean定义解析依赖...

    java模拟spring ioc

    通过以上步骤,我们可以实现一个简单的Java模拟Spring IOC的系统。这种方式可以帮助开发者更好地理解Spring的工作原理,并在没有Spring框架的环境中实现相同的功能。不过,需要注意的是,Spring框架提供了更高级的...

    模拟spring

    通过模拟Spring的实现,我们可以更深入地了解Spring框架的运作机制,包括IoC容器的初始化、bean的生命周期管理、AOP的实现原理等。同时,动手实践能帮助我们更好地掌握这些概念,并将其应用于实际项目中。 总的来说...

    spring原理模拟

    让我们通过一个简单的例子来模拟Spring的实现。假设我们有一个`UserService`需要依赖`DatabaseService`,在传统模式下,`UserService`会直接创建`DatabaseService`的实例。但在Spring中,我们可以在配置文件中声明这...

    模拟spring ioc过程

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

    尚学堂_Spring_0100_模拟Spring

    《尚学堂_Spring_0100_模拟Spring》 在深入探讨Spring框架之前,我们需要先理解Spring的核心理念。Spring是一个开源的Java平台,它主要为构建企业级应用提供了全面的编程和配置模型。它的核心特性是依赖注入...

    模拟spring和工具jar包

    本资源名为“模拟spring和工具jar包”,其目的是为了帮助我们理解Spring框架的核心概念——依赖注入,并通过一个简化版的实现来学习这一机制。 依赖注入是Spring框架的核心特性之一,它允许我们在不直接创建对象的...

    自定义ioc容器,spring ioc容易模拟程序

    通过这个简单的自定义IOC容器,我们可以理解Spring的IOC容器是如何工作的。Spring的容器更加复杂和强大,它支持XML配置、基于注解的配置,以及更复杂的依赖解析规则。此外,Spring还提供了AOP(面向切面编程)、事务...

Global site tag (gtag.js) - Google Analytics