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所以我又要去回忆一下 ...
随机推荐
- 全平台轻量开源verilog仿真工具iverilog+GTKWave使用教程
前言 如果你只是想检查Verilog文件的语法是否有错误,然后进行一些基本的时序仿真,那么Icarus Verilog 就是一个不错的选择.相比于各大FPGA厂商的IDE几个G的大小,Icarus V ...
- Java多态之向下转型
目录 Java多态之向下转型 强制类型转换 instanceof Java多态之向下转型 往期回顾:我们学习了向上转型和动态绑定的概念,可以知道在继承关系中,将一个子类对象赋值给父类的引用变量,调用父 ...
- aspnet boilerplate 随笔二
项目框架介绍: 1:Application: 在service里面事件具体业务,Dto相当于viewmodel实现了验证 2:Core:实现了数据层Model 3:EntityFrameworkC ...
- 在项目中在线使用Iconfont图标
Iconfont真的很强大,图标数量惊人,基本任意的关键词都能搜索到你想要的结果.而且是国产的,网速会比较快,还可以改变图标颜色. 它提供svg.png.ai三种格式下载,之前我一直都是乖乖的一个个下 ...
- Android 中 MessageQueue 的 nativePollOnce
Android SDK 中的事件循环已经是一个老生常谈的问题了, 像 Handler Looper MessageQueue 这几个类也是被大家研究透彻了. 但是再回头看以前自己的分析, 总感觉差点什 ...
- docker快速部署本地项目到服务器(tomcat8+mysql8)
目标是:将本地运行的spring项目,部署到服务器上 为什么使用docker? 环境隔离 服务器上,各种环境交杂,使用docker,能清楚的把各个项目进行隔离,不单维护的人员方便,也会省去很多维护这些 ...
- MSP430系列单片机特性及应用领域
概述 MSP430系列单片机是德州仪器1996年开始推向市场的一种16位超低功耗的混合信号处理器,给人们留下的最大的亮点是低功耗而且速度快,汇编语言用起来很灵活,寻址方式很多,指令很少,容易上手.主要 ...
- Java用广度优先搜索快速搜索文件
背景 在开发的过程中,经常需要在文件系统里按某些条件搜索文件,比如音乐播放器扫描音乐,而搜索文件,大多人喜欢用递归的方式,而这也是最容易想到的方式.递归方式如果文件夹很深就容易造成栈溢出,而且不断的压 ...
- 利用WPF生成Q币充值二维码——扫码登录篇
一.前言 虽然腾讯官方不支持使用二维码充值Q币,但对于喜欢钻研的人来说这不是问题,本文利用WPF技术讲解从扫码登录到生成Q币充值二维码的一整套解决方案. 因为充值Q币需要先用QQ号登录官网.所以我们首 ...
- .net core百万设备连接服务和硬件需求测试
随着物联网的普及,服务应用将面对大量物联设备处理:早期.NET在通讯上的处理能力一直给人的印像并不怎样,但net core经历过大量的优化后在各个模块的处理性能都有着比较出色的提升,针对网络方向的处理 ...