模拟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!
分享到:
相关推荐
"模拟Spring架构的简易实现"这个项目可能是为了理解和学习Spring框架的基本原理而创建的,它可能通过简单的代码来模拟Spring的一些核心功能。 首先,我们要理解Spring的核心概念。依赖注入是Spring最基础的设计模式...
本篇文章将详细解析“模拟Spring IOC技术”的核心概念,并通过一个小Demo帮助你深入理解IOC的工作原理。 首先,我们来解释一下什么是IOC和DI。控制反转(IOC)是编程中的一个设计原则,它改变了对象获取依赖的方式...
当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...
在Spring框架中,BeanFactory接口是Spring工厂的核心,它代表了一个容器,可以管理各种Bean的生命周期。当我们配置Spring时,我们定义Bean的元数据,如Bean的类、依赖关系等,这些信息会被Spring解析并存储在Bean...
Spring框架是Java应用程序开发中的一个核心组件,它提供了一个依赖注入(DI)和面向切面编程(AOP)的解决方案。在Spring中,`ClassPathXmlApplicationContext`是用于加载和管理配置元数据的一个重要类,它允许我们...
现在,我们将深入探讨如何模拟Spring的IoC容器实现注解自动装配。 首先,我们需要理解IoC容器的基本工作原理。IoC容器是通过扫描应用程序上下文来发现所有需要管理的bean,并根据bean定义来创建和初始化这些bean。...
描述中的链接指向了CSDN博客的一个文章,虽然具体内容无法直接复制到这里,但我们可以根据文章标题推测,该文章详细介绍了如何从零开始构建一个简单的IOC容器,以此来模拟Spring框架的工作原理。通过这种方式,学习...
2. **接口驱动的设计**:Spring提供了大量可扩展的接口,如`ApplicationContext`、`BeanFactory`等,开发者可以通过实现这些接口来定制自己的应用上下文或bean工厂。此外,Spring的AOP也依赖于接口,如`Advisor`和`...
本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...
8. **模拟Spring底层原理**:"02-手写模拟Spring底层原理-周瑜"和"01-Spring底层核心原理解析-周瑜"提供了从零开始构建类似Spring框架的实践机会,通过动手实践加深对Spring核心机制的理解。 这些源码解析资料覆盖...
6. **Test**:测试模块支持在开发过程中对 Spring 应用进行单元测试和集成测试,提供了模拟对象、测试上下文框架以及与各种测试框架的集成。 7. **Spring Boot**:近年来,Spring Boot 成为了快速开发 Spring 应用...
5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...
1. **Core Container**:核心容器包含Bean工厂(BeanFactory)和应用上下文(ApplicationContext),它们负责管理对象的生命周期和依赖注入。 2. **Data Access/Integration**:数据访问模块包括JDBC、ORM(Object-...
Spring Test 和 Spring Boot Test 对象可以帮助开发者轻松地编写测试用例,并模拟复杂的依赖关系。 **9. Spring Expression Language (SpEL)** SpEL 是 Spring 的表达式语言,用于在运行时查询和操作对象图。它可以...
13. **spring-mock.jar**:这是一个专门用于单元测试的jar包,提供了模拟HTTP请求的能力,帮助开发者更容易地测试Spring应用程序中的控制器和其他Web组件。 #### 总结 从Spring2.0到Spring2.5及以后的版本,Spring...
- **核心容器**:这是 Spring 框架的基础,包含了 BeanFactory 和 ApplicationContext 等核心组件,负责管理对象的生命周期和依赖关系。 - **上下文**:提供了一个配置文件,允许 Spring 与外部系统进行交互,例如 ...
6. 消息:支持多种消息传递技术,包括Java消息服务(JMS)、邮政API(JavaMail)和简单消息服务(Spring Integration)等。 7. 测试:提供了支持单元测试和集成测试的工具,如Spring TestContext框架,它支持JUnit...
此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...
源码中,我们可以看到 `org.springframework.beans.factory.annotation.Autowired` 注解用于自动装配依赖,以及 `org.springframework.beans.factory.BeanFactory` 和 `org.springframework.beans.factory.config....