这个小项目是我读过一点Spring的源码后,模仿Spring的IOC写的一个简易的IOC,当然Spring的在天上,我写的在马里亚纳海沟,哈哈
感兴趣的小伙伴可以去我的github拉取代码看着玩
地址: https://github.com/zhuchangwu/CIOC
项目中有两种方式实现IOC:
- 第一种是基于dom4j实现的解析XML配置文件版
- 第二种是基于自定义注解实现全配置版
全注解版
模仿Spring原生的IOC机制如下:
- Interface类型的beanDefinition不会被实例化**
- String类型的beanDefinition不会被实例化
-
维护三个核心的map容器
- 使用底层存放实例化对象的容器是一个叫
singletonObjects
的CurrentHashMap - 第二个用来辅助解决循环依赖的容器叫
singletonFactories
类型:CurrentHashMap - 第三个用来存放bean定义信息的map容器叫
beanDefinitionMap
类型:CurrentHashMap
- 使用底层存放实例化对象的容器是一个叫
Spring底层的自己还封装了BeanDefinition, 当然我没干这件事,直接用的类的描述对象 Class
自定义了四种注解如下:
- CDao 用于标识持久层的对象
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CDao {
String value()default "";
}
- CService 用来标识服务层的对象
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface CService {
String value()default "";
}
- CComponentScan 用来标识主配置类,提供包扫描需要的base-packet
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface CComponentScan {
String value()default "";
}
- CAutowired 用来标识需要自动装配的对象
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CAutowired {
String value()default "";
}
当然他跟Spring原生的@Autowired是没法比的,Spring自动装配类型默认是Autowired_no, 但是被Spring原生标记上的对象会先按照默认的装配类型进行装配,如果没有默认的装配类型,再按照byType,如果容器中存在多个相同类型的对象,就按照byName, 名字再一样就直接报错了
另外我说一下,说了这么多byName和byType, 那么byName,是通过哪个name呢? 如果是基于setter方法的话就是setter去掉set后,后面的名字, 如果是通过@Autowired的byName,这个name其实就是属性名
Spring是允许程序员去改这个默认的装配类型的
然后在我的IOC中就比较逊色了,直接默认按照byType,没有合适的类型再按照byName进行自动装配
解决了循环依赖的问题
在我手动写如何解决循环依赖的时候,那时候我还没有去看源码, 当时我画了几个流程图,但是还是卡壳了, 于是我去调试Spring的实现, 简直了!Spring的作者们简直是真神!
其实说Spring如何解决循环依赖的,我前面有几个源码阅读的博客,感兴趣可以去看看
这里我就简单的说下, 这件事是一个叫AutowiredAnnotationBeanDefinitonPostprocessor
的后置处理器完成的, Spring在做这件事是时候,前前后后是一个偌大的继承体系在支持,但是归根结底是Spring玩了个漂亮的递归,方法名是getBean(),当然这个递归还有几个辅助容器,这几个容器就是我上面说的几个map ,我的IOC能写成,就得益于这一点
XML版
注解版的IOC我是用DOM4j解析XML配置文件实现的, 做了下面的功能
- 支持setter方法依赖注入
标识性的信息是 property
<bean id="dao1" class="com.changwu.dao.DaoImpl1"></bean>
<bean id="service" class="com.changwu.service.UserServiceImpl4">
<property ref="dao1" name="daoImpl"></property>
</bean>
- 支持构造方法的依赖注入
标识性的信息是 constructor-arg
<bean id="DaoImpl" class="com.changwu.dao.DaoImpl1"></bean>
<bean id="service" class="com.changwu.service.UserServiceImpl3">
<constructor-arg ref ="DaoImpl" name="DaoImpl1"></constructor-arg>
</bean>
</bean>
- 支持byType的自动装配
标识性的信息是 byType
<beans default-autowire="byType">
- 主持byName的自动装配
<beans default-autowire="byName">
感兴趣的小伙伴可以去我的github拉取代码看着玩
地址: https://github.com/zhuchangwu/CIOC
手写一个简易的IOC的更多相关文章
-
来,我们手写一个简易版的mock.js吧(模拟fetch &;&; Ajax请求)
预期的mock的使用方式 首先我们从使用的角度出发,思考编码过程 M1. 通过配置文件配置url和response M2. 自动检测环境为开发环境时启动Mock.js M3. mock代码能直接覆盖g ...
-
手写一个简易的多周期 MIPS CPU
一点前言 多周期 CPU 相比单周期 CPU 以及流水线 CPU 实现来说其实写起来要麻烦那么一些,但是相对于流水线 CPU 和单周期 CPU 而言,多周期 CPU 除了能提升主频之外似乎并没有什么卵 ...
-
用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
-
[转]用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
-
手写一个简易版Tomcat
前言 Tomcat Write MyTomcat Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器.那么想一想,Tomcat和我们的Web应用是什么关系? 从感性上 ...
-
【spring】-- 手写一个最简单的IOC框架
1.什么是springIOC IOC就是把每一个bean(实体类)与bean(实体了)之间的关系交给第三方容器进行管理. 如果我们手写一个最最简单的IOC,最终效果是怎样呢? xml配置: <b ...
-
手写一个HTTP框架:两个类实现基本的IoC功能
jsoncat: 仿 Spring Boot 但不同于 Spring Boot 的一个轻量级的 HTTP 框架 国庆节的时候,我就已经把 jsoncat 的 IoC 功能给写了,具体可以看这篇文章&l ...
-
我手写的简易tomcat
前述 自己手写的简易的tomcat,实现了tomcat的基本响应功能,项目代码已经上传到我的Github,刚刚开始学习这里,当前还存在很多问题 项目简述及代码 当我们的Web运行的时候,从浏览器发出的 ...
-
仿写一个简陋的 IOC/AOP 框架 mini-spring
讲道理,感觉自己有点菜.Spring 源码看不懂,不想强行解释,等多积累些项目经验之后再看吧,但是 Spring 中的控制反转(IOC)和面向切面编程(AOP)思想很重要,为了更好的使用 Spring ...
随机推荐
-
poj2513Colored Sticks(无向图的欧拉回路)
/* 题意:将两端涂有颜色的木棒连在一起,并且连接处的颜色相同! 思路:将每一个单词看成一个节点,建立节点之间的无向图!判断是否是欧拉回路或者是欧拉路 并查集判通 + 奇度节点个数等于2或者0 */ ...
-
springmvc上传图片并显示图片--支持多图片上传
实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: <dependency> <groupId>comm ...
-
jQuery - 4.简单选择器
4.1 简单选择器 (1) :first 选取第一个元素. (2) :last 选取最后一个元素. (3) :not(选择器) 选取不满足"选择器"条件的元素 (4) ...
-
关于setTimeout的妙用前端函数节流
最近在某团队忙于一个项目,有这么一个页面,采用传统模式开发(吐槽它为什么不用React),它的DOM操作比较多,然后性能是比较差的,尤其当你缩放窗口时,可怕的事情发生了,出现了卡顿,甚至浏览器瘫痪.为 ...
-
Oracle Hint 用法
正确的语法是: select /*+ index(x idx_t) */ * from t x where x.object_id=123 /*+ */ 和注释很像,比注释多了一个“+”,这就是 ...
-
mokoid android open source HAL hacking in a picture
/************************************************************************** * mokoid android HAL hac ...
-
[转载]解析WINDOWS中的DLL文件---经典DLL解读
[转载]解析WINDOWS中的DLL文件---经典DLL解读 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! ...
-
Codeforces Round #361 (Div. 2) C.NP-Hard Problem
题目连接:http://codeforces.com/contest/688/problem/C 题意:给你一些边,问你能否构成一个二分图 题解:二分图:二分图又称作二部图,是图论中的一种特殊模型. ...
-
python笔记24-os模块
import osprint(os.getcwd())#取当前工作目录#os.chmod('/usr/local',7)#给文件目录加权限,7是最高权限print(os.chdir(r"e: ...
-
shiro登录验证原理
这段时间有点忙,没咋写博客,今天打开staruml看到以前画的一张shiro原理图,先在这发一下,空了再好好进行分析.