spring的简易实现(一)
【练习】spring的简易实现(一)
在第一部分我们实现读取xml的配置,然后实例化xml中的bean
首先定义一个xml和相关的class类
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="petStore"
class="org.litespring.service.v1.PetStoreService" >
</bean>
<bean id="invalidBean"
class="xxx.xxxxx" >
</bean>
</beans>
package org.litespring.service.v1;
public class PetStoreService {
}
我们先把目标写出来,即测试用例。就是先把我们想要达到的效果展示出来,然后再一步步的代码去实现
package org.litespring.test.v1;
import org.junit.Assert;
import org.junit.Test;
import org.litespring.context.ApplicationContext;
import org.litespring.context.support.ClassPathXmlApplicationContext;
import org.litespring.context.support.FileSystemXmlApplicationContext;
import org.litespring.service.v1.PetStoreService;
public class ApplicationContextTest {
@Test
public void testGetBean() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("petstore-v1.xml");
PetStoreService petStore = (PetStoreService)ctx.getBean("petStore");
Assert.assertNotNull(petStore);
}
}
看到这里,我们发现自己只要可以读取xml(借助dom4j.jar),以及通过反射实例化一个对象那么就可以实现了。按照这个思路,我们可以很容易地实现下面这样的代码。
首先定义一个BeanDefinition,它用来存储xml中的bean定义
public class BeanDefinition {
private String id;
private String className;
public BeanDefinition(String id, String className) {
this.id = id;
this.className = className;
}
public String getId() {
return id;
}
public String getClassName() {
return className;
}
}
然后,我们实现主体的逻辑部分
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.InputStream;
import java.util.*;
public class ClassPathXmlApplicationContext {
private Map<String, BeanDefinition> bds = new HashMap<>();
public ClassPathXmlApplicationContext(String filePath) throws Exception {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(filePath);
SAXReader reader = new SAXReader();
Document doc = reader.read(is);
Element root = doc.getRootElement();
Iterator<Element> iter = root.elementIterator();
while(iter.hasNext()){
Element ele = iter.next();
String id = ele.attributeValue("id");
String className = ele.attributeValue("class");
bds.put(id, new BeanDefinition(id, className));
}
}
public Object getBean(String id) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
BeanDefinition bd = bds.get(id);
String className = bd.getClassName();
Class<?> clz = this.getClass().getClassLoader().loadClass(className);
return clz.newInstance();
}
}
然后,我们欣喜的看到测试用例可以成功。最后,我们反思一下自己写的代码,并且和spring的实现对比。会发现,有很多可以重构的地方


我们直接画一个UML类图来看吧

代码实现见:https://github.com/Theone21/mylitespring BeanFactory分支
本文由博客一文多发平台 OpenWrite 发布!
spring的简易实现(一)的更多相关文章
- 基于Spring的简易SSO设计
通常稍微规模大一些的企业,内部已经有很多的应用系统,多个系统整合首先要解决的便是“统一登录(SSO)”问题,之前写过一篇 利用Membership实现SSO(单点登录) ,java环境下已经有一些开源 ...
- Spring框架总结
Spring(由Rod Johnson创建的一个开源框架) Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spr ...
- Spring1:Spring简介、环境搭建、源码下载及导入MyEclipse
框架学习前言 这个模块是面向Spring的,Spring的学习我是这么想的: 1.简单介绍Spring,主要是从网上借鉴一些重点 2.尽量说明清楚Spring的使用方法以及细节点 3.尽量以自己的理解 ...
- Spring 框架概述
◆简介 目的:解决企业应用开发的复杂性 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能 范围:任何Java应用 Spring 框架是一个分层架构,由 7 个定义良好的模块组成. ...
- Spring核心技术
这是第二次看关于Spring的资料,由于刚開始学习Spring的时候是边看视频边学习的,所以更注重的是实现代码,可是对宏观的掌握还是不够,这次主要从宏观的角度来分析一下Spring. 什么是Sprin ...
- spring框架内置笔记本
◆基本介绍 目的:解决企业应用开发的复杂性 特征:使用主JavaBean更换EJB,它提供了许多其他的企业应用 范围:随你Java应用 Spring 框架是一个分层架构.由 7 个定义良好的模块组成. ...
- Spring详解(一)------概述
本系列教程我们将对 Spring 进行详解的介绍,相信你在看完后一定能够有所收获. 1.什么是 Spring ? Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开 ...
- Spring框架入门之Spring简介
一.Spring简介(由Rod Johnson创建的一个开源框架) Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿 ...
- Spring(一)Spring的第一滴血
前言 开始工作了,但是一进来公司本来是做爬虫和数据分析的,但是走了一个后端的,导致我必须要去顶替他的工作.因为这个项目使用的是Spring. SpringMVC.Hibernate所以我又要去回忆一下 ...
随机推荐
- zabbix 监控apache
现在是客户端 1.安装zabbix的rpm源 1 rpm -ivh http://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-release-4.4 ...
- docker 创建.netcore2.2 api容器 以及连接mysql容器
1]环境说明 操作系统:Window 10 专业版 开发工具 Vs2019专业版 Docker: Docker for Windows docker在windows上安装完毕之后可以看到 2]拉取 ...
- C#线程学习笔记九:async & await入门二
一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...
- C# dictionary to bytes and bytes convert to dictionary
static byte[] GetBytesFromDic(Dictionary<string,string> dic) { if(dic==null || !dic.Any()) { r ...
- MongoDB(八):索引
1. 索引 索引支持查询的有效地提高效率.没有索引,MongoDB必须扫描集合的每个文档,以选择与查询语句匹配的文档.这种扫描效率很低,需要MongoDB处理大量的数据. 索引是特殊的数据结构,以易于 ...
- Jupyter修改设置
下载完anaconda后Jupyter默认目录是用户目录,默认浏览器是IE,让有强迫症的我有点难受,所以把它的默认目录和浏览器修改一下. 首先运行一下jupyter notebook --genera ...
- IT兄弟连 HTML5教程 CSS3属性特效 3D变换2
3 perspective-origin景深基点 perspective-origin景深基点属性时3D变形中另一个重要属性,主要用来决定perspective属性的源点角度.它实际上设置了X轴和Y ...
- 灵魂拷问:创建 Java 字符串,用""还是构造函数
在逛 programcreek 的时候,我发现了一些小而精悍的主题.比如说:创建 Java 字符串,用 "" 还是构造函数?像这类灵魂拷问的主题,非常值得深入地研究一下. 01.& ...
- Java网络爬虫 HttpClient
简介 : HttpClient是Apache Jakarta Common下的子项目,用于提供高效的,功能丰富的支持HTTP协议的客户编程工具包,其主要功能如下: 实现了所有HTTP的方法 : GET ...
- 【THUPC 2018】赛艇
Problem Description Lavender.Caryophyllus.Jasmine.Dianthus现在在玩一款名叫"赛艇"的游戏. 这个游戏的规则是这样的: 玩家 ...