手写一个简易的IOC

这个小项目是我读过一点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, 名字再一样就直接报错了

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

原文地址:https://www.cnblogs.com/xyy2019/p/11830832.html

时间: 2024-11-02 10:14:44

手写一个简易的IOC的相关文章

自己手写一个简易的警告框,和关于滚动条的那些事儿

初来乍到,请大家多多指教! 这已经是我工作的第二周了,刚刚到公司还是有许多的不适应与羞涩,更多的是紧张,随时都会被项目惊醒,公司只有我一个前端开发,对于没有开发经验的我来说无疑是一个挑战,而且这一周正式算做项目的日子,为期一个月,做的是公司的关于账号和作品等的一个内部管理系统,感觉写起来没有什么要求,但就最怕这种没有要求的东西,没有人管,没人指导,感觉什么都只有按照自己以往一贯的书写代码的方式来,最怕最后不合格........呵呵呵,也许这就是我一个初到职场,一个小小菜鸟的畏畏缩缩的小心理吧!

手写一个简易版Tomcat

前言 Tomcat Write MyTomcat Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器.那么想一想,Tomcat和我们的Web应用是什么关系? 从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat中,在我们的Web应用中,我们要指明URL被哪个类的哪个方法所处理(不论是原始的Servlet开发,还是现在流行的Spring MVC都必须指明). 由于我们的Web应用是运行在Tomcat中,那么显然,请求必定是先到达Tomcat的.To

手写一个简易的ajax请求

function ajax(url){ const p=new Promise((resolve,reject)=>{ const xhr=XMLHttpRequest() xhr.open('GET','/data/test.json',true) xhr.onreadystatechange=function(){ if(xhr.readyState===4){ if(xhr.status===200){ JSON.parse(xhr.responseText) }else if(xhr.s

来,咱们自己写一个Android的IOC框架!

到目前位置,afinal开发框架也是用了好几个月了,还记得第一次使用注释完成控件的初始化和事件绑定的时候,当时的心情是多么的兴奋- -代码竟然可以这样写!然后随着不断的学习,也慢慢的对IOC框架和注解反射等东西有了一点简单的了解,之前的一篇文章简单的介绍了一下Java的反射机制,今天的文章,就完成一个简单的,基于IOC的小Demo,让大家慢慢的对IOC有一点简单的了解. 首先,什么是IOC呢? 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来

放弃antd table,基于React手写一个虚拟滚动的表格

缘起 标题有点夸张,并不是完全放弃antd-table,毕竟在react的生态圈里,对国人来说,比较好用的PC端组件库,也就antd了.即便经历了2018年圣诞彩蛋事件,antd的使用者也不仅不减,反而有所上升. 客观地说,antd是开源的,UI设计得比较美观(甩出其他组件库一条街),而且是蚂蚁金服的体验技术部(一堆p7,p8,p9,基本都是大牛级的)在持续地开发维护,质量可以信任. 不过,antd虽好,但一些组件在某一些场景下,是很不适用的.例如,以表格形式无限滚动地展示大量数据(1w+)时,

利用SpringBoot+Logback手写一个简单的链路追踪

目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简单的链路追踪,下面详细介绍下. 一.实现原理 Spring Boot默认使用LogBack日志系统,并且已经引入了相关的jar包,所以我们无需任何配置便可以使用LogBack打印日志. MDC(Mapped Diagnostic Context,映射调试上下文)是log4j和logback提供的一种

手写一个模块化的 TCP 服务端客户端

前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识. 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”. 对于 Socket 编程这类所需知识偏底层的情况(OS 协议栈的运作机制,TCP 协议的理解,多线程的理解,BIO/NIO 的理解,阻塞函数的运作原理甚至是更底层处理器的中断.网卡等外设与内核的交互.核心态与内核态的切

手写一个IOC容器

链接:https://pan.baidu.com/s/1MhKJYamBY1ejjjhz3BKoWQ 提取码:e8on 明白什么是IOC容器: IOC(Inversion of Control,控制反转).这是spring的核心,贯穿始终.所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系. 传统的java代码中,我们需要使用哪个对象,就new一个对象,很正常对吧? 然而,这时出现了一个新思想:IOC(控制反转) 由它创建和管理所有的对象,我们需要的时

Spring系列之手写一个SpringMVC

目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AOP的原理及手动实现 Spring系列之手写注解与配置文件的解析 引言 在前面的几个章节中我们已经简单的完成了一个简易版的spring,已经包括容器,依赖注入,AOP和配置文件解析等功能.这一节我们来实现一个自己的springMvc. 关于MVC/SpringMVC springMvc是一个基于mvc模式的web框架,SpringMVC框架是一种提供了MVC(模型 - 视图 - 控制器)架