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

简单模拟Spring的beanFactory

阅读更多

模拟spring的bean工厂,主要涉及到的角色:

1:  抽象产品角色       由Moveable.java来充当

2:  具体产品角色       由Car.java类和Train.java来充当

3:抽象工厂角色       由BeanFactory.java 接口来充当

4:  具体工厂角色       由ClasspathXmlApplicationContext.java来实现,用来从classpath的类路径读取文件

在这里主要使用dom4j的方式来解析xml文件,具体代码如下:

抽象产品角色:

/**
 * 
 */
package com.gd.spring.factory;

/**
 * @author sandy
 * 抽象产品类Moveable  可移动的
 */
public interface Moveable {
	void moving();
}

 具体产品角色:

 

/**
 * 
 */
package com.gd.spring.factory;

/**
 * @author sandy
 *  具体产品类角色
 */
public class Car implements Moveable {

	/* (non-Javadoc)
	 * @see com.cn.gd.spring.factory.Moveable#moving()
	 */
	public void moving() {
      System.out.println("汽车启动..........................");
	}

}

 

 

/**
 * 
 */
package com.gd.spring.factory;

/**
 * @author sandy
 *
 */
public class Train implements Moveable {

	/* (non-Javadoc)
	 * @see com.cn.gd.spring.factory.Moveable#moving()
	 */
	public void moving() {
    System.out.println("火车冒着烟开始启动。。。。。。。。。。。。。。。。");
	}

}

 

 抽象工厂角色:

package com.gd.spring.factory;
/**
 * 
 * @author sandy
 * 抽象bean工厂
 */
public interface  BeanFactory {
	Object  getBean(String id);
}

 

    

 具体工厂角色:

/**
 * 
 */
package com.gd.spring.factory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

/**
 * @author sandy
 * 从classpath环境配置读取配置文件 该类实现了Bean工厂接口
 */
public class ClasspathXmlApplicationContext implements BeanFactory {

	//定义一个存放bean信息的容器
	private Map<String, Object> container = new HashMap<String, Object>();
    //把传进来fileName文件用dom4j的方式解析,把解析后的结果放到容器container中
	public ClasspathXmlApplicationContext(String fileName) {
		SAXReader reader = new SAXReader();
		Document document;
		try {
			document = reader.read(this.getClass().getClassLoader()
					.getResourceAsStream(fileName));
			Node root = document.selectSingleNode("/beans");
			List list = root.selectNodes("bean");
			for (Object o : list) {
				Element element = (Element) o;
				String beanId = element.attributeValue("id");
				Object clazz = Class.forName(element.attributeValue("class"))
						.newInstance();
				container.put(beanId, clazz);
			}
		} catch (DocumentException e1) {
			e1.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
   //根据beanId来从容器中获得bean的实例
	public Object getBean(String beanId) {
		return container.get(beanId);
	}
}

 

客户端测试代码:

/**
 * 
 */
package com.gd.spring.factory;
/**
 * @author sandy
 * 模拟spring客户端调用程序
 */
public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		init();
	}
	private static void init() {
		//加载  applicationContext.xml配置文件
		BeanFactory factory = new ClasspathXmlApplicationContext(
				"applicationContext.xml");
		Object o = factory.getBean("v");
		Moveable m = (Moveable) o;
		m.moving();
	}
}

 

applicationContext.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="v" class="com.gd.spring.factory.Car"></bean>
</beans>

 

若想调用产品train的moving方法,则只需要在上面的applicationContext.xml中添加Train的配置信息即可入如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="v" class="com.gd.spring.factory.Car"></bean>
	<bean id="train" class="com.gd.spring.factory.Train"></bean>
</beans>

 

然后在客户端只需要调用beanId为train的bean即可,附件儿中是完整的程序that's  all!

 

 

 

0
0
分享到:
评论

相关推荐

    模拟Spring架构的简易实现

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

    模拟spring ioc技术

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

    Java模拟的spring实现

    当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...

    模拟spring工厂模式底层实现。

    在Spring框架中,BeanFactory接口是Spring工厂的核心,它代表了一个容器,可以管理各种Bean的生命周期。当我们配置Spring时,我们定义Bean的元数据,如Bean的类、依赖关系等,这些信息会被Spring解析并存储在Bean...

    模拟spring中的ClassPathXmlApplicationContext类的实现

    Spring框架是Java应用程序开发中的一个核心组件,它提供了一个依赖注入(DI)和面向切面编程(AOP)的解决方案。在Spring中,`ClassPathXmlApplicationContext`是用于加载和管理配置元数据的一个重要类,它允许我们...

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

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

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

    描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...

    spring简单模拟(面向抽象/接口编程)

    2. **接口驱动的设计**:Spring提供了大量可扩展的接口,如`ApplicationContext`、`BeanFactory`等,开发者可以通过实现这些接口来定制自己的应用上下文或bean工厂。此外,Spring的AOP也依赖于接口,如`Advisor`和`...

    简单Spring容器实现

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

    spring源码合集spring源码合集

    8. **模拟Spring底层原理**:"02-手写模拟Spring底层原理-周瑜"和"01-Spring底层核心原理解析-周瑜"提供了从零开始构建类似Spring框架的实践机会,通过动手实践加深对Spring核心机制的理解。 这些源码解析资料覆盖...

    spring源码注释中文

    6. **Test**:测试模块支持在开发过程中对 Spring 应用进行单元测试和集成测试,提供了模拟对象、测试上下文框架以及与各种测试框架的集成。 7. **Spring Boot**:近年来,Spring Boot 成为了快速开发 Spring 应用...

    手写简单的Spring框架

    5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...

    spring-framework-5.3.20

    1. **Core Container**:核心容器包含Bean工厂(BeanFactory)和应用上下文(ApplicationContext),它们负责管理对象的生命周期和依赖注入。 2. **Data Access/Integration**:数据访问模块包括JDBC、ORM(Object-...

    spring-framework-4.0.9.RELEASE官方完整包加官方文档

    Spring Test 和 Spring Boot Test 对象可以帮助开发者轻松地编写测试用例,并模拟复杂的依赖关系。 **9. Spring Expression Language (SpEL)** SpEL 是 Spring 的表达式语言,用于在运行时查询和操作对象图。它可以...

    spring2.0和spring2.5 及以上版本的jar包区别 spring jar 包详解

    13. **spring-mock.jar**:这是一个专门用于单元测试的jar包,提供了模拟HTTP请求的能力,帮助开发者更容易地测试Spring应用程序中的控制器和其他Web组件。 #### 总结 从Spring2.0到Spring2.5及以后的版本,Spring...

    spring详细教程

    - **核心容器**:这是 Spring 框架的基础,包含了 BeanFactory 和 ApplicationContext 等核心组件,负责管理对象的生命周期和依赖关系。 - **上下文**:提供了一个配置文件,允许 Spring 与外部系统进行交互,例如 ...

    Spring高级篇.pdf

    6. 消息:支持多种消息传递技术,包括Java消息服务(JMS)、邮政API(JavaMail)和简单消息服务(Spring Integration)等。 7. 测试:提供了支持单元测试和集成测试的工具,如Spring TestContext框架,它支持JUnit...

    spring3.2源码-官方原版.zip

    此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...

    spring3.07

    源码中,我们可以看到 `org.springframework.beans.factory.annotation.Autowired` 注解用于自动装配依赖,以及 `org.springframework.beans.factory.BeanFactory` 和 `org.springframework.beans.factory.config....

Global site tag (gtag.js) - Google Analytics